Javascript “为循环运行”;平行;使用异步/等待承诺
我目前有这样一个for循环:Javascript “为循环运行”;平行;使用异步/等待承诺,javascript,typescript,async-await,promise,Javascript,Typescript,Async Await,Promise,我目前有这样一个for循环: async myFunc() { for (l of myList) { let res1 = await func1(l) if (res1 == undefined) continue let res2 = await func2(res1) if (res2 == undefined) continue if (res2 > 5) { ..
async myFunc() {
for (l of myList) {
let res1 = await func1(l)
if (res1 == undefined) continue
let res2 = await func2(res1)
if (res2 == undefined) continue
if (res2 > 5) {
... and so on
}
}
}
问题是func1、func2是返回承诺的网络调用,我不希望它们在等待它们时阻止我的for循环。因此,我不介意与myList[0]和myList[1]并行工作,也不关心列表项的处理顺序
如何实现这一点?我会编写一个函数来处理一个按顺序处理的值:
async function doOne(l) {
let res1 = await func1(l);
if (res1 == undefined) {
return /*appropriate value*/;
}
let res2 = await func2(res1);
if (res2 == undefined) {
return /*appropriate value*/;
}
if (res2 > 5) {
// ... and so on
}
}
然后我将使用Promise.all
和map
启动所有这些,并让它们并行运行,以数组的形式获得结果(如果需要结果):
如果myList
是(或可能是)不可数组,请使用array。从
获取要在上使用map
的数组:
function myFunc() {
return Promise.all(Array.from(myList.map(doOne)));
}
(或使用来执行推送到数组的循环的操作。)
如果您不希望处理列表中的一个条目时出现故障,从而阻止处理列表中其他条目时看到结果,请使用Promise.allselled
而不是Promise.all
。(请注意,无论哪种方式,他们都将开始,唯一的区别是当至少一个失败时,您是否看到成功的结果。)您可以让em解决/拒绝该承诺,然后在循环中调用他们,而不是让他们返回承诺。如果您不想处理这些响应,那么最好有更多的代码,看看是否所有的设置都是正确的。通常,您会在等待承诺后使用。然后()
执行某些操作,以确保它按顺序运行。然后,您可以通过第二次调用调用另一个函数,如。然后((result)=>{callAnotherFunction(result);})
@Frizzant-在异步
函数中,您使用等待
(如上所述),而不是。然后(95%的时间)。
function myFunc() {
return Promise.all(Array.from(myList.map(doOne)));
}