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

Pourquoi Promise.all se résout-il prématurément avec des éléments non définis ?

DDD
Libérer: 2024-10-30 07:40:17
original
301 Les gens l'ont consulté

Why Does Promise.all Resolve Prematurely with Undefined Elements?

Promise.all se résout prématurément avec des éléments non définis

Description du problème

Dans une application JavaScript, une fonction renvoie un tableau rempli d'éléments non définis lorsque en utilisant Promise.all. Ce problème survient avant que la fonction ne termine ses opérations. Voici la fonction problématique :

<code class="js">classMethods.getQueries = function(models, dbId, dateStart, dateEnd) {
  return new Promise(function(resolve, reject) {
    // Fetch database.
    .then(extractQueries, reject)
      .then(sortQueries, reject)
      .then(onlyTen, reject)
      .then(addText, reject)
      .then(function(queries) {
        console.log("getQueries finished", queries); // Array of 10× undefined!
        resolve(queries);
      }, reject);

    // Functions here.
  });
};</code>
Copier après la connexion

La fonction addText est identifiée comme la cause première du problème :

<code class="js">function addText(queries) {
  // This line is missing the `return` keyword.
  Promise.all(queries.map(function(query) {
    models.queries.findById(query.queryId, {
      raw: true,
      attributes: [ "query" ]
    })
      .then(function(queryFetched) {
        query.text = queryFetched.query;
        console.log(query);
        
        // Here, missing the `return` keyword in front of `Promise.resolve(query)`.
        return Promise.resolve(query);
      }, function(error) {
        // Missing `return Promise.reject(error);`
      });
  }));
};</code>
Copier après la connexion

Résolution

Pour résoudre le problème, vous devez n'oubliez pas de renvoyer les promesses dans le rappel de carte de Promise.all :

<code class="js">function addText(queries) {
  return Promise.all(queries.map(function(query) {
    // Add `return` here to fix the problem.
    return models.queries
      .findById(query.queryId, {
        raw: true,
        attributes: [ "query" ]
      })
      .then(function(queryFetched) {
        query.text = queryFetched.query;
        console.log(query);
        
        // Add `return` here.
        return Promise.resolve(query);
      }, function(error) {
        // Add `return` here.
        return Promise.reject(error);
      });
  }));
};</code>
Copier après la connexion

En ajoutant les instructions de retour manquantes, vous encapsulez désormais correctement chaque appel de base de données dans une promesse et renvoyez le résultat Promise.all lorsque toutes les promesses individuelles ont résolu. Cela garantit que la fonction getQueries reçoit le résultat correct lorsque toutes les requêtes sont récupérées et traitées.

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