Promise.all 在完成之前返回一个未定义和解析的数组

Promise.all is returning an array of undefined and resolves before being done

本文关键字:一个 未定义 和解 数组 all 返回 Promise      更新时间:2023-09-26

我在返回undefined数组的函数时遇到问题。

这是代码:

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

一切都很好,直到addText功能:

function addText(queries) {
  return 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);
        
        return Promise.resolve(query);
      }, function(error) {
        return Promise.reject(error);
      });
  }));
};

这给了我一个输出,如下所示:

"getQueries finished" [ undefined ×10 ]
10×
[query database]
{ queryId: "…", text: "…" }

我不知道为什么在循环未完成的情况下返回承诺。

Promise.all接受Promise对象的数组。您得到的是一组undefined,因为您在map回调中没有返回任何承诺:

function addText(queries) {
  return Promise.all(queries.map(function(query) {
    // Add `return` here or the `map` returns an Array of `undefined`.
    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);
      });
  }));
};

undefined 这样的基元值将在 Promise.all 中立即解析,因此它会在回调中的任何 Promise 解析之前解析。

所以这里是我的问题的解决方案:

function addText(queries) {
  return Promise.all(queries.map(function(query) {
    return new Promise(function(resolve, reject) {
      models.queries.findById(query.queryId, { raw: true, attributes: ['query'] })
      .then(function(queryFetched) {
         query.text = queryFetched.query;
         resolve(query);
      }, reject);
    });
  }));
};

我遇到了同样的问题,我的Promise.all(list),导致一个未定义的数组,我使用相同的方法向我的函数添加return