TL; DR
Utilisez Promise.all
pour les appels de fonctions parallèles, les comportements de réponse ne sont pas correctement lorsque l'erreur se produit.
Tout d'abord, exécutez tous les appels asynchrones à la fois et obtenez tous les Promise
objets. Deuxièmement, utilisez await
sur les Promise
objets. De cette façon, pendant que vous attendez que le premier Promise
résolve les autres appels asynchrones progressent toujours. Dans l'ensemble, vous n'attendez que le temps de l'appel asynchrone le plus lent. Par exemple:
// Begin first call and store promise without waiting
const someResult = someCall();
// Begin second call and store promise without waiting
const anotherResult = anotherCall();
// Now we await for both results, whose async processes have already been started
const finalResult = [await someResult, await anotherResult];
// At this point all calls have been resolved
// Now when accessing someResult| anotherResult,
// you will have a value instead of a promise
Exemple JSbin: http://jsbin.com/xerifanima/edit?js,console
Mise en garde: Peu importe si les await
appels sont sur la même ligne ou sur des lignes différentes, tant que le premier await
appel se produit après tous les appels asynchrones. Voir le commentaire de JohnnyHK.
Mise à jour: cette réponse a un timing différent dans la gestion des erreurs selon la réponse de @ bergi , elle ne jette PAS l'erreur car l'erreur se produit mais après que toutes les promesses ont été exécutées. Je compare le résultat avec le conseil de @ jonny:, [result1, result2] = Promise.all([async1(), async2()])
vérifiez l'extrait de code suivant
const correctAsync500ms = () => {
return new Promise(resolve => {
setTimeout(resolve, 500, 'correct500msResult');
});
};
const correctAsync100ms = () => {
return new Promise(resolve => {
setTimeout(resolve, 100, 'correct100msResult');
});
};
const rejectAsync100ms = () => {
return new Promise((resolve, reject) => {
setTimeout(reject, 100, 'reject100msError');
});
};
const asyncInArray = async (fun1, fun2) => {
const label = 'test async functions in array';
try {
console.time(label);
const p1 = fun1();
const p2 = fun2();
const result = [await p1, await p2];
console.timeEnd(label);
} catch (e) {
console.error('error is', e);
console.timeEnd(label);
}
};
const asyncInPromiseAll = async (fun1, fun2) => {
const label = 'test async functions with Promise.all';
try {
console.time(label);
let [value1, value2] = await Promise.all([fun1(), fun2()]);
console.timeEnd(label);
} catch (e) {
console.error('error is', e);
console.timeEnd(label);
}
};
(async () => {
console.group('async functions without error');
console.log('async functions without error: start')
await asyncInArray(correctAsync500ms, correctAsync100ms);
await asyncInPromiseAll(correctAsync500ms, correctAsync100ms);
console.groupEnd();
console.group('async functions with error');
console.log('async functions with error: start')
await asyncInArray(correctAsync500ms, rejectAsync100ms);
await asyncInPromiseAll(correctAsync500ms, rejectAsync100ms);
console.groupEnd();
})();