我现在有一些看起来像这样的代码。
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,它不需要等待每个函数完成,但仍然保留调用的顺序?
如果你这样做。
const [a, b, c] = await Promise.all([function1(), function2(), function3()];
同步的部分 function1
将首先运行,然后是同步部分的 function2
的同步部分,然后是 function3
. 这时,他们就在比赛中完成了。无论他们完成的顺序如何,你都会得到按顺序排列的结果(a
的结果是 function1
, b
的 function2
等)。)
如果服务器要求 异步 一部分 function1
趁早 function2
启动,那么你就必须使用你的原始代码。在客户端代码中,你唯一能控制的就是当进程中的 开始.
然而,这并不意味着不能对它们进行一下优化,但这很大程度上取决于它们的作用。例如,如果重要的是你收到的是 页眉 回应 function1
的要求,然后再开始 function2
但 function1
在接收到头文件后做进一步的处理(比如读取响应的正文并做一些事情),你可以优化这个功能,但要把它拆分开来。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)
]);