首页 > 解决方案 > 将异步函数传递给 promise.all()

问题描述

我知道promise.all()期待一系列的承诺。

但是,是否可以执行以下操作?如果不是,请提出解决方法。

不建议使用awaitfor循环。这就是为什么我要推入一个数组并这样做promise.all()

var functionArray = [];
for (let i = 0; i < jobs.length; i += 1) {
  ...
  if (params.origins !== '' && params.destinations !== '') {
    functionArray.push(async function() {
      response = await getDistance(params.origins, params.destinations);
      if (response.error) {
        // handle error
        return null
      } else {
        distances = response.data.rows[0].elements.map((el, index) => {
          el.emp_id = empIdOrder[index];
          return el;
        });
        sortedDistances = sortDistance(distances);
        return formatDataForInsert(jobs[i].job_id, sortedDistances);
      }
    });
  }
}
var dataToBeinserted = await Promise.all(functionArray); // return an array with results

它没有按预期工作。

await Promise.all(functionArray);总是返回[ [AsyncFunction], [AsyncFunction] ]

不是应该解决吗?

标签: javascriptpromiseasync-await

解决方案


第一个问题是Promise.all接受一组promises,而不是一组函数——你当前的代码将无法工作。

主要问题是您只是有条件地使用异步操作的结果。您可以链接.then到 Promise 以使 Promise 解析为 的结果.then,而不是其初始解析值。那是:

Promise.resolve(2)
  .then(res => res + 4)

产生一个解析为 6 的 Promise。

使用此逻辑,您可以将 Promise 推送到数组中,该数组在其中then有条件地使用结果 ( distances = response.data...) 并返回最终值,或者不返回任何内容。最后,调用Promise.allPromises 数组,并按布尔值过滤:

const promises = [];
for (let i = 0; i < jobs.length; i += 1) {
  if (params.origins !== '' && params.destinations !== '') {
    promises.push(
      getDistance(params.origins, params.destinations)
        .then((response) => {
          if (response.error) {
            // handle error
            return null
          } else {
            const distances = response.data.rows[0].elements.map((el, index) => {
              el.emp_id = empIdOrder[index];
              return el;
            });
            const sortedDistances = sortDistance(distances);
            return formatDataForInsert(jobs[i].job_id, sortedDistances);
          }
      })
    );
    }
}
const results = await Promise.all(promises)
  .filter(Boolean); // filter out failures

var dataToBeinserted = await Promise.all(functionArray); // return an array with results

推荐阅读