我有一个数组arr,我想为它的每个元素循环。在循环中,我先调用两个fxns A(),然后调用B(),我想要的是循环将并行运行,但是对于每个元素,fxn A必须先运行,然后是fxnB。
我在做什么:
[1,2,3].forEach(async(i)=>{
await A(i);//which call API & console & returns iA
await B(i);//which call API & console & returns iB
console.log('A & B Completed for '+ i)
} )
//Desired Result
1A
1B
A & B Completed for 1
3A //due to parallelism
3B
A & B Completed for 3
2A
2B
A & B Completed for 2
是写作还是其他好方法,请帮忙。
答案 0 :(得分:0)
我想要的是循环将并行运行,但是对于每个元素fxn A必须先运行,然后fxn B。
您所拥有的将做到这一点。 .forEach()
循环本身不会等待await
,因为.forEach()
不能保证可以感知。因此,.forEach()
循环将一直运行到完成,从而(按顺序)开始每个循环迭代,因此它们都将同时“进行中”。它们将按顺序开始,但是在同时运行时,它们可以按任何顺序完成(由目标服务器确定)。
但是,按照这种方式进行操作,您就无法在循环之外就错误,结果甚至完成情况进行交流。
因此,通常最好收集一个诺言数组并使用Promise.all()
来监视诺言的完成(当您要并行运行事物时)。这将为您提供所有您缺少的三件事:
您可以这样做:
let promises = [1,2,3].map(async(i) => {
let resultA = await A(i);//which call API & console & returns iA
let resultB = await B(i);//which call API & console & returns iB
console.log('A & B Completed for '+ i)
return someValue;
});
Promise.all(promises).then(results => {
console.log(results);
}).catch(err => {
console.log(err);
});