Maison > interface Web > js tutoriel > 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
Libérer: 2024-10-31 08:51:30
original
378 Les gens l'ont consulté

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

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

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!

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