【问题标题】:Why does the await keyword not work within an anonymous function? [duplicate]为什么 await 关键字在匿名函数中不起作用? [复制]
【发布时间】:2018-11-29 06:27:58
【问题描述】:

为什么

names.forEach((name) => {
    images.push(await loadImage(name));
})

没用,但是

for (let i = 0; i < names.length; i++) {
    images.push(await loadImage(names[i]));
}

会吗?

注意:loadImage 只是返回一个 Promise,给出一个加载的 Image()
名称是一个字符串列表

【问题讨论】:

  • 匿名函数不是异步函数。
  • await 需要在 async 函数中。
  • 你缺少 async 声明 - async name =&gt; { ... } ?

标签: javascript async-await arrow-functions


【解决方案1】:

forEach 中的第一个参数是它自己的函数。要在函数中使用await,函数必须标记为async。它在循环中起作用,因为没有新函数,并且您正在运行循环的函数可能被标记为async。因此,要使forEach 工作,您需要这样做:

names.forEach(async (name) => {
    images.push(await loadImage(name));
})

但是,这不是最好的事情。你真的想收集承诺,然后等待它们全部完成:

const promises = names.map(name => loadImage(name));
const images = await Promise.all(promises);

【讨论】:

  • “但是,这不是最好的事情,因为你将同步运行它们。你真的想收集承诺,然后等待它们全部完成” i意思是,从技术上讲,.map 也在同步运行它们,它只是让将结果传递给 .all 更容易。
  • @KevinB 这不是真的。我的代码同步触发它们,然后等待它们全部并行完成。上面的forEach 代码将等待每一个完成,然后再运行循环的下一次迭代。
  • 不,forEach 不会等待。 for 循环会。您的答案中的两种情况都将并行运行所有请求。
猜你喜欢
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多