Problème :
Dans la programmation asynchrone traditionnelle, exécution simultanée de plusieurs opérations d'attente est obstrué en raison de la séquence traitement.
Cause :
Le code en question attend la fin de la première opération d'attente avant de lancer la seconde.
Solution proposée :
La proposition initiale d'obtenir des promesses avant de les attendre séparément permet une exécution parallèle. Cependant, cela introduit des problèmes de gestion des erreurs et des erreurs de rejet potentielles non gérées.
Approche recommandée :
Au lieu de la solution proposée, nous vous recommandons d'utiliser Promise.all :
const [value1, value2] = await Promise.all([getValue1Async(), getValue2Async()]);
Avantages de Promise.all :
Exemple :
Considérez l'exemple suivant qui démontre la différence dans le timing et la gestion des erreurs :
const getValue1Async = () => { return new Promise(resolve => { setTimeout(resolve, 500, "value1"); }); }; const getValue2Async = () => { return new Promise((resolve, reject) => { setTimeout(reject, 100, "error"); }); }; // Sequential execution with proposed solution (async () => { try { console.time("sequential"); const p1 = getValue1Async(); const p2 = getValue2Async(); const value1 = await p1; const value2 = await p2; } catch (e) { console.error(e); } console.timeEnd("sequential"); })(); // Concurrent execution with Promise.all setTimeout(async () => { try { console.time("concurrent"); const [value1, value2] = await Promise.all([getValue1Async(), getValue2Async()]); } catch (e) { console.timeEnd("concurrent", e); } }, 1000);
Dans la Exemple d'exécution séquentielle, le code attend 500 ms que la première opération soit terminée avant de lancer la seconde. En revanche, l'exemple d'exécution simultanée gère l'échec de la deuxième opération immédiatement après 100 ms.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!