Maison  >  Article  >  interface Web  >  Polyfills de Promise.all()

Polyfills de Promise.all()

Linda Hamilton
Linda Hamiltonoriginal
2024-10-22 20:43:02362parcourir

Polyfills of Promise.all()

Fonction de Promise.all()

Entrée : il faut un tableau de promesse (pas nécessaire)
Sortie : il renvoie une promesse qui contient un tableau de résultats de toutes les promesses de succès.
Remarque : si une promesse échoue, elle est immédiatement rejetée.

code pour Promise.myAll()

`
Promise.myAll = fonction (promesses) {
retourner une nouvelle promesse (fonction (résoudre, rejeter) {
// Vérifiez si l'entrée est un tableau
if (!Array.isArray(promises)) {
return rejet(new TypeError("L'argument doit être un tableau"));
>

let results = [];
let completedPromises = 0;

promises.forEach(function (promise, index) {
  // Use Promise.resolve to handle non-promise values
  Promise.resolve(promise)
    .then(function (value) {
      results[index] = value;
      completedPromises += 1;

      // If all promises are resolved
      if (completedPromises === promises.length) {
        resolve(results);
      }
    })
    .catch(function (error) {
      reject(error); // Reject if any promise fails
    });
});

// Handle case with empty array of promises
if (promises.length === 0) {
  resolve([]);
}

});
};
`

1. Si toutes les promesses ont été résolues avec succès

. Toutes les promesses sont résolues et leurs résultats sont stockés dans le tableau des résultats.
. Lorsque le nombre de promesses résolues est égal à la longueur du tableau d'entrée, la promesse externe se résout avec le tableau de résultats.

2. Pourquoi utiliser Promise.resolve()

. Il n'est pas nécessaire que dans un tableau de promesses, toute valeur doive être une promesse, elle peut être n'importe quelle valeur - nombre, chaîne ou toute fonction de synchronisation.

  1. Si la valeur transmise est déjà une promesse - Elle renverra la même promesse, garantissant qu'aucun emballage ou modification supplémentaire ne se produira.

  2. Si la valeur transmise n'est pas une promesse - Elle enveloppera la valeur dans une promesse résolue, permettant de la traiter comme une promesse et de la gérer avec .then()

3. Pourquoi Promise.resolve(), pourquoi pas Promise.reject()

Pour qu'il soit résolu avec une valeur, si nous utilisons le rejet, il sera capturé dans le bloc catch avec une valeur considérée comme une erreur.

4. Que se passe-t-il si une promesse échoue ?

  1. Cela déclenche l'appel rejet() de la promesse externe, provoquant le rejet immédiat de Promise.myAll().
  2. la boucle foreach continuera, car le programme est synchronisé
  3. le reste de la promesse sera résolu et sa valeur sera ajoutée au résultat, mais une fois terminéPromise!=promises.length, il ne sera pas résolu, et si vous essayez toujours, il sera ignoré car Promise.myAll() n'est pas en attente maintenant.

Si vous avez encore des questions, n'hésitez pas à les poser dans les commentaires !

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