Maison >interface Web >js tutoriel >Comment Promise.all() peut-il gérer efficacement plusieurs tâches asynchrones avant de passer aux opérations suivantes ?

Comment Promise.all() peut-il gérer efficacement plusieurs tâches asynchrones avant de passer aux opérations suivantes ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-15 19:19:15840parcourir

How Can Promise.all() Efficiently Handle Multiple Asynchronous Tasks Before Proceeding to Subsequent Operations?

Travailler avec plusieurs promesses de manière asynchrone

Cet article vise à aborder les défis liés à l'exécution de plusieurs tâches asynchrones au sein de boucles et la nécessité de garantir leur achèvement avant de procéder aux tâches suivantes.

Problème : gestion des tâches asynchrones dans Boucles

Imaginez un scénario dans lequel une boucle parcourt un ensemble de tâches, chacune étant exécutée de manière asynchrone. Après la boucle, une autre boucle repose sur l'achèvement des tâches de la première boucle. Comment pouvons-nous réaliser cette coordination efficacement ?

Promises et Promise.all()

Les promesses offrent une solution élégante à ce problème. En renvoyant une promesse de doSomeAsyncStuff(), nous pouvons gérer les opérations asynchrones.

Promise.all() est une méthode puissante qui accepte un tableau de promesses et renvoie une seule promesse. Cette promesse unique n'est résolue que lorsque toutes les promesses d'entrée sont résolues ou que l'une d'entre elles est rejetée.

Mise en œuvre

Pour atteindre notre objectif, nous pouvons exploiter Promise.all() comme suit :

const promises = [];

for (let i = 0; i < 5; i++) {
  promises.push(doSomeAsyncStuff());
}

Promise.all(promises)
  .then(() => {
    // Execute tasks that require all async tasks to finish
  })
  .catch((e) => {
    // Handle errors
  });

Dans cette implémentation, nous collectons toutes les promesses dans un tableau et le transmettons à Promise.all(). Une fois sa résolution (ou son rejet), nous procédons aux tâches de la deuxième boucle.

Considérations supplémentaires

  • Pour plus de clarté, utilisez const ou let au lieu de var.
  • Envisagez de gérer les erreurs en utilisant la méthode catch.
  • Pour plus de compréhension, consultez la documentation de MDN sur les promesses et mon livre "JavaScript : The New Toys" (liens fournis dans mon profil).

Exemple

L'exemple suivant montre l'utilisation de Promise.all() pour attendre la fin de plusieurs tâches asynchrones :

function doSomethingAsync(value) {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("Resolving " + value);
      resolve(value);
    }, Math.floor(Math.random() * 1000));
  });
}

function test() {
  const promises = [];

  for (let i = 0; i < 5; i++) {
    promises.push(doSomethingAsync(i));
  }

  Promise.all(promises)
    .then((results) => {
      console.log("All done", results);
    })
    .catch((e) => {
      // Handle errors
    });
}

test();

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