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
/ await
peut 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, .then
vous êtes seul).
Le second ne fonctionne pas car toute exception immédiate dans une async
fonction rejette la promesse implicite renvoyée par la async
fonction 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 myFunction
comme 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
?