Javascript 在循环中调用API和使用异步等待是一种写方法吗
我有一个数组arr,我想循环它的每个元素。在循环中,我先调用两个fxn A(),然后调用B(),我想要的是循环将并行运行,但对于每个元素,fxn A必须先运行,然后再运行fxn B 我正在做的是:Javascript 在循环中调用API和使用异步等待是一种写方法吗,javascript,arrays,node.js,foreach,async-await,Javascript,Arrays,Node.js,Foreach,Async Await,我有一个数组arr,我想循环它的每个元素。在循环中,我先调用两个fxn A(),然后调用B(),我想要的是循环将并行运行,但对于每个元素,fxn A必须先运行,然后再运行fxn B 我正在做的是: [1,2,3].forEach(async(i)=>{ await A(i);//which call API & console & returns iA await B(i);//which call API & console & returns iB
[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
是书写还是其他好方法,请帮忙
我想要的是循环将并行运行,但对于每个元素,fxn A必须先运行,然后再运行fxn B
你所拥有的一切都能做到。.forEach()
循环本身不会等待等待
,因为.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);
});
这是可行的,但最好是不平行地将承诺返回给外部(或者正确处理可能的错误)。并用于()loop@CertainPerformance意味着我应该使用catch?@Deryck是forEach按顺序连续运行的吗?唯一可以实现并行的方法是使用辅助进程或辅助线程(在节点中)或web/服务辅助进程。但对于你发布的“按顺序”运行的内容——可能不是。forEach不在乎等待。如果您需要排序,请使用for(){…}或使用
Promise.resolve()
进行reduce,同时返回Promise.then()
每次迭代。