【发布时间】: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(() => reqest())将首先等待第一个请求,然后再等待下一个请求。任何时候您不在做出另一个承诺之前等待一个承诺解决,操作将是并行的。因此,如果您将所有承诺存储在一个数组中,那已经是非顺序的。Promise.all只是让您方便地知道何时完成。
标签: javascript node.js promise async-await