javascript - 按顺序触发异步调用

标签 javascript node.js async-await es6-promise

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

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的同步部分.那时,他们正在为完成而竞争。无论他们完成的顺序如何,您都会按顺序获得结果(afunction1 的结果,bfunction2 等)。

如果服务器要求 异步 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/

相关文章:

node.js - Sails 拒绝与 sails-postgresql 模块的 PostgreSQL 连接

c# - 异步任务之间的依赖关系

c# - 匿名异步,怎样才是正确的做法?

javascript - 如何修复以下代码,该代码旨在向时间戳添加分钟,并且最终值也应该在时间戳中,因为我将进行一些数据库查询?

javascript - 我可以将 2 个骨髓动画序列合并到一个语句中,并且仍然得到相同的结果吗?

events - 使用Node.js监听Redis上的按键事件

javascript - 使用 sinon 和 mocha 执行测试时不执行 stub 函数

python - 在新线程中启动异步函数

javascript - 集合检查框 = 集合检查框

javascript - extjs 3.x 设计选项卡面板的样式