按顺序进行异步调用

问题描述 投票:2回答:2

我现在有一些看起来像这样的代码。

const a = await function1();
const b = await function2();
const c = await function3();

但是我想优化速度,不想有延迟。我试着做了以下操作

[const a, const b, const c] = await Promise.all([function1, function2, function3)]

这很好用,但是我的问题是,我不能保留从我的机器发起的调用的顺序。当我在每个请求上发送一个nonce时,如果请求的顺序是1-> 3-> 2而不是1->2->3,那么终端服务器会拒绝请求。

有没有一种方法可以使用Promise.all,它不需要等待每个函数完成,但仍然保留调用的顺序?

javascript node.js async-await es6-promise
2个回答
2
投票

如果你这样做。

const [a, b, c] = await Promise.all([function1(), function2(), function3()];

同步的部分 function1 将首先运行,然后是同步部分的 function2的同步部分,然后是 function3. 这时,他们就在比赛中完成了。无论他们完成的顺序如何,你都会得到按顺序排列的结果(a 的结果是 function1, bfunction2等)。)

如果服务器要求 异步 一部分 function1 趁早 function2 启动,那么你就必须使用你的原始代码。在客户端代码中,你唯一能控制的就是当进程中的 开始.

然而,这并不意味着不能对它们进行一下优化,但这很大程度上取决于它们的作用。例如,如果重要的是你收到的是 页眉 回应 function1的要求,然后再开始 function2function1 在接收到头文件后做进一步的处理(比如读取响应的正文并做一些事情),你可以优化这个功能,但要把它拆分开来。function1 分为两个部分。一部分是开始处理并消耗头文件, 另一部分是消耗主体并对其进行处理。

如果你这样做,你会这样做。

// Do the first part in series
const r1 = await function1PartA();
const r2 = await function2PartA();
const r3 = await function3PartA();
// Do the remainder in parallel
const [a, b, c] = await Promise.all([
    function1PartB(r1),
    function2PartB(r2),
    function3PartB(r3)
]);
© www.soinside.com 2019 - 2024. All rights reserved.