我现在有一些看起来像这样的代码:
const a = await function1();
const b = await function2();
const c = await function3();
但是我正在尝试优化速度并且不希望延迟。我尝试过以下操作
[const a, const b, const c] = await Promise.all([function1, function2, function3)]
这很好用,但是我遇到的问题是我无法保留从我的机器发起的调用的顺序。当我在每个请求上发送一个随机数时,如果它按照 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
发送的 header 开始前的请求function2
, 但是 function1
在收到 header 后进行进一步处理(例如读取响应的正文并进行某些操作),您可以对其进行优化但拆分 function1
分为两部分:启动进程并使用 header 的部分,以及使用主体并对其进行处理的部分。如果你这样做了,你会这样做:
// 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)
]);
关于javascript - 按顺序触发异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62043398/