Javascript 按顺序触发异步调用

Javascript 按顺序触发异步调用,javascript,node.js,async-await,es6-promise,Javascript,Node.js,Async Await,Es6 Promise,我现在有一些代码如下所示: const a = await function1(); const b = await function2(); const c = await function3(); // Do the first part in series const r1 = await function1PartA(); const r2 = await function2PartA(); const r3 = await function3PartA(); // Do the re

我现在有一些代码如下所示:

const a = await function1();
const b = await function2();
const c = await function3();
// 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)
]);
不过,我正在努力优化速度,不希望出现延迟。我试着做了以下几件事

[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()];
首先运行
功能1
的同步部分,然后运行
功能2
的同步部分,然后运行
功能3
的同步部分。在这一点上,他们正在为完成而竞争。无论它们以何种顺序完成,您都将按顺序获得结果(
a
function1
的结果,
b
function2
的结果,等等)

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

然而,这并不意味着不可能对它们进行一点优化,但这在很大程度上取决于它们所做的工作。例如,如果重要的是您在启动
function2
之前收到响应
function1
请求而发送的标题,但是
function1
在收到标题后会进行进一步处理(例如读取和处理响应主体),您可以对此进行优化,但可以将
function1
分为两部分:启动流程并使用标题的部分,以及使用正文并对其执行操作的部分

如果你这样做了,你会这样做:

const a = await function1();
const b = await function2();
const c = await function3();
// 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)
]);

维护什么秩序?您得到的响应将按从服务器发送的顺序排序。Will Update为什么订单在这里很重要?函数2是否以任何方式依赖于函数1?因此,您不能更改顺序,您需要按顺序进行,但是…您正在尝试优化,要这样做,您删除了顺序?我不明白。如果不可能以不同的顺序发出请求,那么您就无法真正优化此处的任何内容,您需要等待每个请求得到处理。如果您能够并行运行请求,那么顺序就无关紧要了。那么解决方案就是不执行并发请求。它们将受到网络延迟的影响,即使您以正确的顺序发送它们(就像您的代码那样)。您可以a)更改API以允许只使用一个请求同时执行所有部分b)更改API以忽略在短时间内收到的无序请求c)为客户端获取三个独立的nonce d)只需按顺序执行请求。