有没有办法在异步函数中等待多个等待调用?
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
它允许您等待多个承诺。
【讨论】:
以上是关于有没有办法在异步函数中等待多个等待调用?的主要内容,如果未能解决你的问题,请参考以下文章