繁体   English   中英

按顺序触发异步调用

[英]Fire async calls in order

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

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 不等待每个 function 完成但仍保留调用顺序?

如果你这样做:

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

function1的同步部分将首先运行,然后是function2的同步部分,然后是function3的同步部分。 那时,他们正在为完成而竞争。 无论它们完成的顺序如何,您都会按顺序获得结果( afunction1的结果, bfunction2的结果,等等)。

如果服务器要求function2异步部分在function1启动之前完成,那么您必须使用您的原始代码。 您在客户端代码中拥有的唯一控制是进程何时开始

但是,这并不意味着不可能对它们进行一点优化,但这在很大程度上取决于它们的工作。 例如,如果重要的是您在启动function2之前收到了响应function1的请求而发送的标,但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)
]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM