Vous utilisez effectivement des promesses dans la fonction exécuteur du constructeur de promesse, c'est donc l' anti-modèle du constructeur Promise .
Votre code est un bon exemple du risque principal: ne pas propager toutes les erreurs en toute sécurité. Lisez pourquoi là-bas .
De plus, l'utilisation de async/ awaitpeut rendre les mêmes pièges encore plus surprenants. Comparer:
let p = new Promise(resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
avec un asyncéquivalent naïf (faux) :
let p = new Promise(async resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
Recherchez le dernier dans la console Web de votre navigateur.
Le premier fonctionne car toute exception immédiate dans une fonction exécuteur de constructeur Promise rejette commodément la promesse nouvellement construite (mais à l'intérieur de celle-ci, .thenvous êtes seul).
Le second ne fonctionne pas car toute exception immédiate dans une asyncfonction rejette la promesse implicite renvoyée par la asyncfonction elle-même .
Puisque la valeur de retour d'une fonction exécuteur de constructeur de promesse n'est pas utilisée, c'est une mauvaise nouvelle!
Votre code
Il n'y a aucune raison pour laquelle vous ne pouvez pas définir myFunctioncomme async:
async function myFunction() {
let array = await getAsyncArray();
return new Promise((resolve, reject) => {
eachLimit(array, 500, (item, callback) => {
}, error => {
if (error) return reject(error);
});
});
}
Mais pourquoi utiliser des bibliothèques de contrôle de concurrence obsolètes lorsque vous en avez await?