首页  >  文章  >  web前端  >  为什么 Promise.all 会因未定义的元素而过早解析?

为什么 Promise.all 会因未定义的元素而过早解析?

DDD
DDD原创
2024-10-30 07:40:17301浏览

Why Does Promise.all Resolve Prematurely with Undefined Elements?

Promise.all 过早解析未定义的元素

问题描述

在 JavaScript 应用程序中,函数在以下情况下返回充满未定义元素的数组:使用 Promise.all。此问题在函数完成其操作之前出现。这是有问题的函数:

<code class="js">classMethods.getQueries = function(models, dbId, dateStart, dateEnd) {
  return new Promise(function(resolve, reject) {
    // Fetch database.
    .then(extractQueries, reject)
      .then(sortQueries, reject)
      .then(onlyTen, reject)
      .then(addText, reject)
      .then(function(queries) {
        console.log("getQueries finished", queries); // Array of 10× undefined!
        resolve(queries);
      }, reject);

    // Functions here.
  });
};</code>

addText 函数被确定为问题的根本原因:

<code class="js">function addText(queries) {
  // This line is missing the `return` keyword.
  Promise.all(queries.map(function(query) {
    models.queries.findById(query.queryId, {
      raw: true,
      attributes: [ "query" ]
    })
      .then(function(queryFetched) {
        query.text = queryFetched.query;
        console.log(query);
        
        // Here, missing the `return` keyword in front of `Promise.resolve(query)`.
        return Promise.resolve(query);
      }, function(error) {
        // Missing `return Promise.reject(error);`
      });
  }));
};</code>

解决方案

要解决此问题,您必须记得在 Promise.all 的映射回调中返回 Promise:

<code class="js">function addText(queries) {
  return Promise.all(queries.map(function(query) {
    // Add `return` here to fix the problem.
    return models.queries
      .findById(query.queryId, {
        raw: true,
        attributes: [ "query" ]
      })
      .then(function(queryFetched) {
        query.text = queryFetched.query;
        console.log(query);
        
        // Add `return` here.
        return Promise.resolve(query);
      }, function(error) {
        // Add `return` here.
        return Promise.reject(error);
      });
  }));
};</code>

通过添加缺少的 return 语句,您现在可以正确地将每个数据库调用包装在 Promise 中,并在所有单独的 Promise 都满足时返回 Promise.all 结果解决了。这确保了 getQueries 函数在获取和处理所有查询时收到正确的结果。

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

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