我有一个由续集 findAll 产生的 promise 对象,我尝试使用 map
循环数据但它不像我需要的那样工作。这是我的代码示例:
const list = await queueProcess.findAll({
where: {
id: {[Op.between]: [start, end]},
is_active: true
},
attributes: ['id', 'param_value']
});
await Promise.all(
list.map(async (e) => {
console.log("Promise");
const check = await checkProcess(e.id);
})
)
这是另一个文件中的另一个函数:
checkProcess: async (id) =>{
console.log("Check");
}
它给了我结果:
Promise
Promise
Check
Check
我需要的是
Promise
Check
Promise
Check
为什么会发生这种情况?我认为我的代码是合适的,并且可以异步工作。
最佳答案
每个 .map
回调都会立即并行运行 - list
中的每个项目都会导致 Promise
被记录,并且checkProcess
为每个调用。这里的 Promise 之间并不存在本质上的联系(直到它们解析,之后 Promise.all
会识别它并自行解析)。
如果您希望每次迭代在下一次迭代开始之前完全解析,请使用 for
循环进行串行处理,而不是使用 Promise.all
(用于并行处理):
for (const e of list) {
console.log('Promise');
const check = await checkProcess(e.id);
}
关于Javascript Promise 对象无法与 Promise.all 异步工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60945860/