Maison >interface Web >js tutoriel >Comment Promise.all peut-il améliorer l'exécution des attentes simultanées et la gestion des erreurs ?

Comment Promise.all peut-il améliorer l'exécution des attentes simultanées et la gestion des erreurs ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-11 16:15:11738parcourir

How Can Promise.all Improve Concurrent Await Execution and Error Handling?

Exécution d'attente simultanée : surmonter l'exécution séquentielle

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 :

  • Initie l'exécution parallèle de toutes les promesses fournies.
  • Gère le rejet correctement, en évitant les erreurs de rejet non gérées.
  • Fournit une description plus concise et syntaxe cohérente par rapport à la proposition solution.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn