Promise.all可以尽快处理结果,而不是等待所有的承诺

时间:2017-11-17 08:16:51

标签: node.js koa

我正在使用KOA2演示一个bigpipe。我希望在准备就绪时尽快输出结果,而不是等到所有结果都准备就绪(然后全部输出)。

我坚持下面的代码:(get_usersget_posts返回承诺)

async (ctx, next) => {

    ctx.res.write("<html><body>...")

    let data = await Promise.all( [res_fetch.get_users(), res_fetch.get_posts()] )

    ctx.res.write(data[0])
    ctx.res.write(data[1])
    ctx.res.write("</body></html>")
    ctx.res.end()

}

理想情况下它应该是:(我不知道如何实现)

let data = await Promise.oneFinished( [res_fetch.get_users(), res_fetch.get_posts()] )

if (data[0] is finished)
    ctx.res.write(data[0])
else if (data[1] is finished)
    ctx.res.write(data[1])

2 个答案:

答案 0 :(得分:1)

&#13;
&#13;
  let data = await
    Promise.all([
        res_fetch.get_users().then(result => {
            ctx.res.write(result)
        }),
        res_fetch.get_posts().then(result => {
            ctx.res.write(result)
        }),
    ])


    ctx.res.write("</body></html>")
    ctx.res.end()
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您正在寻找的是Promise.race,它会从首先解决(或拒绝)的集合中返回承诺!

let data = await Promise.race( [res_fetch.get_users(), res_fetch.get_posts()] )

if (data[0] is finished)
    ctx.res.write(data[0])
else if (data[1] is finished)
    ctx.res.write(data[1])