小编典典

并行调用 async/await 函数

all

据我了解,在 ES7/ES2016 中,将多个await‘s 放入代码中的工作方式类似于使用 Promise
链接.then(),这意味着它们将一个接一个地执行而不是并行执行。因此,例如,我们有以下代码:

await someCall();
await anotherCall();

我是否理解正确,anotherCall()只有在完成时才会调用someCall()?并行调用它们的最优雅方式是什么?

我想在 Node 中使用它,所以也许有异步库的解决方案?


阅读 115

收藏
2022-03-03

共1个答案

小编典典

您可以等待Promise.all()

await Promise.all([someCall(), anotherCall()]);

存储结果:

let [someResult, anotherResult] = await Promise.all([someCall(), anotherCall()]);

请注意,Promise.all快速失败,这意味着一旦提供给它的承诺之一被拒绝,那么整个事情都会被拒绝。

const happy = (v, ms) => new Promise((resolve) => setTimeout(() => resolve(v), ms))
const sad = (v, ms) => new Promise((_, reject) => setTimeout(() => reject(v), ms))

Promise.all([happy('happy', 100), sad('sad', 50)])
  .then(console.log).catch(console.log) // 'sad'

相反,如果您想等待所有的承诺履行或拒绝,那么您可以使用Promise.allSettled.
请注意,Internet Explorer 本身并不支持此方法。

const happy = (v, ms) => new Promise((resolve) => setTimeout(() => resolve(v), ms))
const sad = (v, ms) => new Promise((_, reject) => setTimeout(() => reject(v), ms))

Promise.allSettled([happy('happy', 100), sad('sad', 50)])
  .then(console.log) // [{ "status":"fulfilled", "value":"happy" }, { "status":"rejected", "reason":"sad" }]

注意: 如果您使用Promise.all在拒绝发生之前设法完成的操作不会回滚,因此您可能需要注意这种情况。例如,如果您有 5 个动作,4
个快速,1 个慢速和慢速拒绝。这 4 个操作可能已经执行,因此您可能需要回滚。在这种情况下,请考虑使用Promise.allSettledwhile
它将提供哪些操作失败和哪些失败的确切细节。

2022-03-03