顺序循环-等待所有承诺

时间:2020-11-06 09:33:53

标签: javascript node.js promise async-await

我只是想让代码的最后一行仅在所有updateInkLevel函数执行完毕后才运行。

  let accessToken
  for (let i = 0; i < activeDevices.length; i++) {
    if (i % 100 === 0) {
      accessToken = await wppServices.getAccessToken()
    }

    updateInkLevel(accessToken, deviceId, logIndex) // if no await here, all parts will run in parallel
    await new Promise((r) => setTimeout(r, 500)) // add a small sleep delay
  }
  logger.info(`${head}] END. COMPLETED ${activeDevices.length} printers.`)

updateInkLevel是一个异步函数,返回一个Promise。我当时在考虑使用Promise.all,但是那样会并行运行每个迭代,这不是我想要的。在这里,我每次都以较小的睡眠延迟间隔依次触发一次迭代。

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

1 个答案:

答案 0 :(得分:0)

await new Promise((r) => setTimeout(r, 500)) // add a small sleep delay

不要那样做。

您正在猜测 updateInkLevel需要花费多长时间


await返回的承诺updateInkLevel

这将暂停循环,直到承诺解决为止。


我当时在考虑使用Promise.all,但是那样可以并行运行每个迭代,这不是我想要的。

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