有没有办法在异步函数中等待多个等待调用?

Posted

技术标签:

【中文标题】有没有办法在异步函数中等待多个等待调用?【英文标题】:Is there a way to await multiple await calls within a async function? 【发布时间】:2021-01-25 15:33:18 【问题描述】:

此函数读取我所有的电影文档并解析某些属性;在我的个人收藏中创建新文档。

错误信息:-------------------------------------------- ----

等待 Person.create( ^^^^^ SyntaxError: await 仅在异步函数中有效

【问题讨论】:

此处的问题不应包含图像中的代码。这使得人们很难将代码复制/粘贴到答案中,这使得代码和 cmets 无法被索引,这使得某些可访问性变得更加困难,等等......请将代码作为文本粘贴并正确格式化。例如,如果我想向您展示编写代码的正确方法,我必须手动重新键入您在该图像中拥有的所有内容,这非常低效。您不想让人们难以为您提供完整而彻底的答案。 【参考方案1】:

编辑 正如@jfriend00、Array.forEach expects a synchronous function 所指出的,并且不处理 Promises/async/await。要使用 async 和 await,您应该使用 for 循环替换所有使用 Array.forEach

for (const movie of movieObj)  ... 

至于等待多个异步调用,如果您希望这些调用真正是异步的,而不是等待每个单独的调用,您可以使用Promise.all 在异步调用的数组 上等待。由于它接受一系列承诺,因此您需要使用Array.map。例如,您可以这样做:

await Promise.all(arrayWriters.map((el) => Person.create(...)));

【讨论】:

但是,.forEach() 不支持 promise,因此在其回调中使用 await 不会暂停循环。 @jfriend00 你说得对,很好。而不是.forEach(),OP 应该依赖:for (let movie of movieObj) await ... 是的,如果您将其修改为不显示.forEach() 的使用并显示for 循环的用户,您的答案将是一个更好的答案。【参考方案2】:

结帐Promise.all(): https://developer.mozilla.org/de/docs/Web/javascript/Reference/Global_Objects/Promise/all 它允许您等待多个承诺。

【讨论】:

以上是关于有没有办法在异步函数中等待多个等待调用?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将等待/异步 try/catch 块包装到每个函数?

如何使用回调在任何函数中调用异步等待方法

如何在没有等待的情况下调用异步函数?

如何等待来自 forEach 循环的多个异步调用?

在 iOS 中等待多个网络异步调用

如何在异步函数中处理多个等待