javascript - 使用 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 推送到该变量。但是,当我更改迭代对象数组时,我不确定如何实现我的目标。
解决方案
在您的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
),但我猜它是一个接受变量并返回承诺的函数 - 但这是想法,准备可迭代然后调用它。
推荐阅读
- node.js - 如何在命令行中直接运行 node / babel 脚本?
- ios - 在标题中显示集合视图图像
- react-select - 在 react-select 2.0.0 版本中将 menuPortalTarget 设置为 document.body 时无法选择以下选项
- mysql - SQL:如何根据其他用户的点赞来推荐具有相关性的点赞?
- sql - 无法更新绑定的 datagridview
- mysql - mysql POINT坐标的导出/导入问题
- ajax - 如何在 Ajax Laravel 5.6 中循环查看
- ssis - 在条件拆分中添加条件
- python - 在 AWS Elastic Beanstalk 中将 Python 版本从 3.6 更改为 2.7
- javascript - 谷歌时间线图无持续时间任务