Javascript “为循环运行”;平行;使用异步/等待承诺

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) { ..

我目前有这样一个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) {
            ... 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)));
}