Maison > interface Web > js tutoriel > le corps du texte

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

Linda Hamilton
Libérer: 2024-10-31 09:10:02
original
342 Les gens l'ont consulté

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);
  });
};
Copier après la connexion

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);
      });
  }));
};
Copier après la connexion

É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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!