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)只需按顺序执行请求。