首页 > 解决方案 > 使用 Promise.all 避免等待每个单独的循环迭代

问题描述

我想在 for 循环迭代期间更改对象数组 (t) 的项目 (f)。下面显示的代码工作正常。

for (const f of t) {
  f.value = await getValue(f.a, f.b)
  f.coordinate = 'not empty'
}

但是,我想在调用时避免使用 await 关键字getValue ,而是使用 Promise.all或其他替代方法来同时执行许多getValue函数调用。目前,每次迭代都会等待getValue函数完成,然后再继续下一次循环迭代。

无需更改正在迭代的对象,我将使用一个promises数组变量来解决它,我在每次迭代期间将 promise 推送到该变量。但是,当我更改迭代对象数组时,我不确定如何实现我的目标。

标签: javascript

解决方案


在您的for...of循环中,只需准备稍后在 await Promise.all()中调用的可迭代对象

let promises = [];
for (const f of t) {
  promises.push(getValue(f.a, f.b))
  f.coordinate = 'not empty'
}
// and then call Promise all with or without async await syntax
Promise.all(promises).then((values) => {
  console.log(values);
});
// or
let result = await Promise.all(promises);

我不知道你的承诺是如何工作的(getValue),但我猜它是一个接受变量并返回承诺的函数 - 但这是想法,准备可迭代然后调用它。


推荐阅读