首页  >  文章  >  web前端  >  为什么 Promise.all 解析时会出现未定义的值?

为什么 Promise.all 解析时会出现未定义的值?

Linda Hamilton
Linda Hamilton原创
2024-10-31 09:10:02343浏览

Why Does Promise.all Resolve with Undefined Values?

尽早解决 Promise.all:避免未定义的数组

概述

Promise.all 是一个强大的工具,用于并发执行多个异步操作并聚合它们结果。但是,如果使用不当,可能会导致意外行为,例如使用未定义值的数组进行解析。

问题

考虑给定的代码:

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);
  });
};

在这里,addText 函数在映射回调中的任何单个 Promise 被解析之前返回一个 Promise.all 未定义的值。这会导致 getQueries 解析为未定义的数组。

解决方案

要在所有承诺完成后解析,请从每个映射回调返回承诺:

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);
      });
  }));
};

避免Promise.all 中未定义

请记住,Promise.all 接受 Promise 对象的数组。未定义的值将立即解析,可能导致过早解析。始终返回每个单独操作的承诺,以确保正确的结果数组。

以上是为什么 Promise.all 解析时会出现未定义的值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn