Maison >interface Web >js tutoriel >Pourquoi Promise.all se résout-il prématurément avec des éléments non définis ?

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

DDD
DDDoriginal
2024-10-30 07:40:17401parcourir

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>

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>

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>

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!

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