首页 > web前端 > js教程 > 在映射中使用异步函数时,为什么 Promise.all 会解析为未定义值的数组?

在映射中使用异步函数时,为什么 Promise.all 会解析为未定义值的数组?

DDD
发布: 2024-11-02 09:27:02
原创
697 人浏览过

Why is Promise.all resolving with an array of undefined values when using async functions within a map?

Promise.all 解析未定义数组:揭开谜底

Promise 提供了异步编程模型,从而提高了代码可读性和流程控制。然而,有时会出现意想不到的问题。这个问题探讨了为什么 Promise.all 返回未定义的数组并过早解析。

有问题的代码遵循典型的承诺链模式:

<code class="javascript">const getQueries = (models, dbId, dateStart, dateEnd) => {
  return new Promise((resolve, reject) => {
    // Fetch database and perform operations
    .then(extractQueries, reject)
      .then(sortQueries, reject)
      .then(onlyTen, reject)
      .then(addText, reject)
      .then((queries) => {
        console.log("getQueries finished", queries);
        resolve(queries);
      }, reject);
  });
};</code>
登录后复制

成功完成初始操作后操作中,问题出现在addText函数中:

<code class="javascript">const addText = (queries) => {
  return Promise.all(queries.map((query) => {
    // Oops! We're missing a `return` here!
    models.queries.findById(query.queryId, {
      raw: true,
      attributes: ["query"],
    })
      .then((queryFetched) => {
        query.text = queryFetched.query;
        console.log(query);

        return Promise.resolve(query);
      }, (error) => {
        return Promise.reject(error);
      });
  }));
};</code>
登录后复制

问题的根本原因在于map回调函数中缺少return语句。 Promise.all 需要一个 Promise 对象数组,但如果没有返回,回调会为查询数组中的每个元素返回 undefined。

因此,Promise.all 立即解析为一个 undefined 数组,甚至在之前地图内的实际承诺有机会解决。这种过早的解决方案会导致意外的行为和一组未定义的值。

要纠正此问题,在 addText 函数中的每个 Promise 调用之前添加 return 语句至关重要:

<code class="javascript">const addText = (queries) => {
  return Promise.all(queries.map((query) => {
    return models.queries.findById(query.queryId, {
      raw: true,
      attributes: ["query"],
    })
      .then((queryFetched) => {
        query.text = queryFetched.query;
        console.log(query);

        return Promise.resolve(query);
      }, (error) => {
        return Promise.reject(error);
      });
  }));
};</code>
登录后复制

现在,Promise.all 将正确等待数组中的所有 Promise 解析,从而产生包含查询结果的预期输出。

以上是在映射中使用异步函数时,为什么 Promise.all 会解析为未定义值的数组?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板