Maison  >  Article  >  interface Web  >  Pourquoi Promise.all() se résout-il prématurément avec un tableau de valeurs non définies ?

Pourquoi Promise.all() se résout-il prématurément avec un tableau de valeurs non définies ?

DDD
DDDoriginal
2024-10-31 08:51:30299parcourir

Why Does Promise.all() Resolve Prematurely with an Array of Undefined Values?

Résolution prématurée de Promise.all() avec un tableau d'indéfinis

Problème

"Promise.all renvoie un tableau d'indéfinis et se résout avant d'être fait." Ce problème se produit lorsqu'une fonction utilisant Promise.all() renvoie un tableau de valeurs non définies, se résolvant prématurément avant que toutes les promesses du tableau ne soient remplies.

Explication

Dans Promises, Promise.all( ) attend un tableau d’objets promis. Un tableau de valeurs non définies est créé ici car le rappel map dans la fonction addText manque de retours Promise.

<code class="js">function addText(queries) {
  return Promise.all(queries.map(function(query) {
    // Insert a `return` statement here.
    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);
      });
  }));
};</code>

Sans l'instruction return, le rappel map renverra un tableau de valeurs non définies, déclenchant la résolution de Promise. .all() prématurément, même si les requêtes ne sont pas encore terminées.

Solution

Assurez-vous que chaque rappel de carte renvoie une promesse en plaçant le code dans des instructions return.

<code class="js">function addText(queries) {
  return Promise.all(queries.map(function(query) {
    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);
      });
  }));
};</code>

Ce faisant, Promise.all() attendra que toutes les promesses du tableau soient résolues avant de se résoudre, garantissant ainsi que l'ensemble du processus se termine avec succès.

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