Maison >interface Web >js tutoriel >Pourquoi Promise.all résout-il avec des valeurs non définies ?

Pourquoi Promise.all résout-il avec des valeurs non définies ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-31 09:10:02432parcourir

Why Does Promise.all Resolve with Undefined Values?

Résoudre Promise.all tôt : éviter les tableaux non définis

Présentation

Promise.all est un outil puissant pour exécuter simultanément plusieurs opérations asynchrones et agréger leurs résultats. Cependant, s'il n'est pas utilisé correctement, cela peut entraîner un comportement inattendu, tel qu'une résolution avec un tableau de valeurs non définies.

Problème

Considérez le code donné :

classMethods.getQueries = function(models, dbId, dateStart, dateEnd) {
  return new Promise(function(resolve, reject) {
    ...
    then(addText, reject)
      .then(function(queries) {
        console.log("getQueries finished", queries); // Array of 10× undefined!
        resolve(queries);
      }, reject);
  });
};

Ici, la fonction addText renvoie un Promise.all de valeurs non définies avant que l'une des promesses individuelles du rappel de carte ne soit résolue. Cela provoque la résolution de getQueries avec un tableau de valeurs indéfinies.

Solution

Pour résoudre une fois que toutes les promesses sont remplies, renvoyez la promesse de chaque rappel de carte :

function addText(queries) {
  return Promise.all(queries.map(function(query) {
    // Return the promise to delay resolution until the operation succeeds/fails.
    return models.queries
      .findById(query.queryId, {
        raw: true,
        attributes: [ "query" ]
      })
      .then(function(queryFetched) {
        query.text = queryFetched.query;
        console.log(query);
        
        return Promise.resolve(query);
      }, function(error) {
        return Promise.reject(error);
      });
  }));
};

Éviter Non défini dans Promise.all

N'oubliez pas que Promise.all accepte un tableau d'objets Promise. Les valeurs non définies seront résolues immédiatement, ce qui pourrait entraîner une résolution prématurée. Renvoyez toujours la promesse de chaque opération individuelle pour garantir un ensemble correct de résultats.

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