据我所知,在ES7/ES2016中,将多个await放入代码中的工作原理类似于将.then()与promise 链接在一起,这意味着它们将一个接一个地执行,而不是并行执行.例如,我们有这样的代码:

await someCall();
await anotherCall();

我是不是理解正确了,只有在someCall()完成后才会呼叫anotherCall()?平行呼叫它们最优雅的方式是什么?

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

编辑:我对问题Slowdown due to non-parallel awaiting of promises in async generators中提供的解决方案不满意,因为它使用生成器,而我问的是更一般的用例.

推荐答案

你可以打Promise.all():00等候.

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

要存储结果,请执行以下操作:

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

请注意,Promise.all很快就会失败,这意味着一旦提供给它的一个promise 被拒绝,那么整个promise 就会被拒绝.

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 兑现或拒绝,那么你可以使用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" }]

Note:如果您使用了Promise.all个在拒绝发生之前成功完成的操作,则不会回滚,因此您可能需要注意这种情况.例如

Javascript相关问答推荐

在包装函数中添加日志(log)

react js中的搜索过滤器

React 18,useEffect 被调用了两次

根据光标位置调整 jQuery 自动完成 UI 的大小

两行相同代码的区别

使用谷歌脚本应用程序获取帖子的“401错误代码”

在 Angular 中添加项目时,有没有办法移动到特定索引?

ReactJS 中的私有路由条件运算符

从具有相同 id 的元素列表中动态获取特定元素的值

如何有条件地在 useEffect 中获取

如何将一些 Nuxt 代码转换为一些 Vue?

Form.IO - 如何使 DataGrid 中的下拉选择变得可见

如何在 Javascript 中组合这 2 个正则表达式

如何将 DRACO 加载器与 GLTF 加载器一起使用?

.push( ) 没有更新变量

基于模式 Marklogic/java 脚本批量删除文档

在自定义钩子中创建一个数组是在每次状态更改时重新渲染值

在 WebRTC 中更改密码

在两个不同的网页之间共享 HTML 表单数据

处理网格列值中的货币格式