【问题标题】:Need Promise.all but without running in parallel需要 Promise.all 但没有并行运行
【发布时间】:2022-02-08 17:27:23
【问题描述】:

如何让代码 sn-p 的最后一行 console.log 仅在所有 updateInkLevel 函数执行完毕后才执行?

  for (let i = 0; i < activeDevices.length; i++) {

    updateInkLevel(accessToken, deviceId, logIndex) 
    await new Promise((r) => setTimeout(r, 500)) // add a small sleep delay
  }
  console.log("everything completed")

updateInkLevel 是一个异步函数,返回一个承诺。我正在考虑使用 Promise.all,但这将并行运行每个迭代,这不是我想要的。在这里,我一次按顺序触发每个迭代,在触发下一个调用之前有一个小的睡眠延迟。

我正在寻找类似 Promise.all 的东西,但没有并行运行。

参考资料, Is Node.js native Promise.all processing in parallel or sequentially?

【问题讨论】:

  • 为什么不await updateInkLevel()
  • hmm.. 也许我可以将 updateInkLevel 返回的所有承诺存储在一个数组中,并在循环之后调用承诺?
  • 做(基本上)Promise.all(allUpdateLinkLevels) 仍然并行运行。
  • @VLAZ 根据上面参考中的答案,并行或顺序是在创建时确定的。无论如何,Promise all 只是等待他们解决。
  • 在创建时并没有完全确定。这取决于您是否在旧请求完成之前开始新请求。因此,如果您执行request(); request() 会触发两个请求,但await request(); await request()(或request().then(() =&gt; reqest())将首先等待第一个请求,然后再等待下一个请求。任何时候您在做出另一个承诺之前等待一个承诺解决,操作将是并行的。因此,如果您将所有承诺存储在一个数组中,那已经是非顺序的。 Promise.all 只是让您方便地知道何时完成。

标签: javascript node.js promise async-await


【解决方案1】:
await new Promise((r) => setTimeout(r, 500)) // add a small sleep delay

不要那样做。

你在猜测updateInkLevel需要多长时间


只是awaitupdateInkLevel返回的承诺。

这将暂停循环,直到 promise 解决。


我正在考虑使用 Promise.all,但这会并行运行每个迭代,这不是我想要的。

您确定不希望它们并行吗?这通常会更有效率。

【讨论】:

  • 感谢您的回复。这实际上是设计使然,updateInkLevel 调用外部 API。如果我将所有东西都运行得太近,它将使该服务器过载。睡眠调用是为了在每次调用之间添加一些空间。
  • 我真的不在乎 updateInkLevel 需要多长时间。但我确实想尽快开始下一个。
  • @tinker — 如果你想在调用之间添加空间,那么除了放置一个睡眠函数来等待调用被解决。
  • @tinker 如果服务器很容易过载,我建议在那里也有一些保护/延迟机制。否则,如果恶意方决定只发起大量呼叫,您将面临拒绝服务攻击。
  • @Quentin 如果我这样做,总运行时间会更长。我们将等待每个呼叫完全完成,然后才能开始下一个呼叫。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多