首页  >  文章  >  web前端  >  为什么 Promise.all() 会过早解析一组未定义值?

为什么 Promise.all() 会过早解析一组未定义值?

DDD
DDD原创
2024-10-31 08:51:30299浏览

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

过早地用未定义的数组解析 Promise.all()

问题

“Promise.all 返回一个未定义的数组并在被解析之前解析完毕。”当使用 Promise.all() 的函数返回未定义值的数组时,会出现此问题,在数组中的所有 Promise 都得到满足之前提前解决。

说明

在 Promises 中,Promise.all( ) 需要一个 Promise 对象数组。这里创建了一个未定义值数组,因为addText函数中的map回调缺少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>

如果没有return语句,map回调会返回一个未定义值数组,触发Promise的解析.all() 过早,即使查询尚未完成。

解决方案

通过将代码包含在 return 语句中来确保每个映射回调返回一个 Promise。

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

通过这样做,Promise.all() 将等待数组中的所有 Promise 都得到解析,然后再自行解析,确保整个过程成功完成。

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

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