如何使 Promise 的结果全部按顺序排列

Zho*_* Xu 3 javascript promise es6-promise

问题:case1的输出是0到4,是有序的,而case2的输出是随机的。

我知道case1的结果之所以是有序的,是因为该请求是在前一个请求的结果到来之后发送的。在 case2 中,该请求将不会等待前一个请求的结果。

我的问题是有没有办法也按顺序保留 case2 的结果?

情况1

const main = async () => {
    const arr = Array.of(...[1,2,3,4,5])

    for (let i=0;i<arr.length;i++) {
        console.log(`request:${i}`)
        const res = await request(i)
        console.log(res)
    }


    console.log("next step")

}

const request = (i:number):Promise<number> => {
    return new Promise<number>(((resolve, reject) => {
        setTimeout(()=>{
            resolve(i)
        },Math.random() * 1000)
    }))
}

Run Code Online (Sandbox Code Playgroud)

输出1

closure
request:0
0
request:1
1
request:2
2
request:3
3
request:4
4
next step

Run Code Online (Sandbox Code Playgroud)

案例2

const main = async () => {
    const arr = Array.of(...[1,2,3,4,5])
    await Promise.all(arr.map(async (v,i) => {
        console.log(`request:${v}`)
        const res = await request(v)
        console.log(`result:${res}`)
        console.log(res)
    })).catch((e) => {

    })


    console.log("next step")

}

const request = (i:number):Promise<number> => {
    return new Promise<number>(((resolve, reject) => {
        setTimeout(()=>{
            resolve(i)
        },Math.random() * 1000)
    }))
}

main()

Run Code Online (Sandbox Code Playgroud)

输出2

request:1
request:2
request:3
request:4
request:5
result:4
4
result:5
5
result:1
1
result:3
3
result:2
2
next step

Run Code Online (Sandbox Code Playgroud)

Ben*_*lin 6

Promise.all()以相同顺序返回结果数组;他们只是不会按顺序解决。你可以在你的承诺范围内返回响应request,并且......

const [result1, result2, result3] = await Promise.all([promise1, promise2, promise3]);
Run Code Online (Sandbox Code Playgroud)

或者如果你想迭代一个数组......

const results = await Promise.all([promise1, promise2, promise3]);
Run Code Online (Sandbox Code Playgroud)

  • @ZhongweiXu 如果您只想在前一个承诺解决后运行下一个承诺,那么您将需要单独等待每个承诺。仅当您想同时运行它们时才应使用“Promise.all()”。 (2认同)