据我了解,在 ES7/ES2016 中,将多个await‘s 放入代码中的工作方式类似于使用 Promise 链接.then(),这意味着它们将一个接一个地执行而不是并行执行。因此,例如,我们有以下代码:
await
.then()
await someCall(); await anotherCall();
我是否理解正确,anotherCall()只有在完成时才会调用someCall()?并行调用它们的最优雅方式是什么?
anotherCall()
someCall()
我想在 Node 中使用它,所以也许有异步库的解决方案?
您可以等待Promise.all():
Promise.all()
await Promise.all([someCall(), anotherCall()]);
存储结果:
let [someResult, anotherResult] = await Promise.all([someCall(), anotherCall()]);
请注意,Promise.all快速失败,这意味着一旦提供给它的承诺之一被拒绝,那么整个事情都会被拒绝。
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 本身并不支持此方法。
Promise.allSettled
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 它将提供哪些操作失败和哪些失败的确切细节。