链接到它内部的异步函数的承诺

时间:2017-09-04 18:31:01

标签: javascript async-await

考虑这个简化的代码

;(async () => {
  const a = [1, 2]
  const p = a.map(async (v, i) => {
    if (i === 0) {
      return await 1
    }
    return await p[i - 1]
  })
  console.log(await Promise.all(p))
})()

在V8(Chrome / NodeJS)中,它导致错误“ReferenceError:p未定义”

在Firefox中,它什么都没有提供

问题:这有什么问题吗?

2 个答案:

答案 0 :(得分:4)

我很确定你的意思是a[i-1]。执行p回调时,map变量为not yet initialised。由于backcompat问题,Firefox可能尚未实现时间死区。

当您异步访问p时,您的代码可能(应该)有效,即在await其他内容之后:

const p = a.map(async (v, i) => {
  if (i === 0) {
    return await 1
  }
  await; // delay until `p` is available
  return await p[i - 1]
})

但是我会认为这是一个令人困惑和令人困惑的代码。如果要在异步函数中按顺序执行某些操作,请使用标准循环:

for (const v of a)
  await 1;

如果您想并行运行某些任务,请使用Promise.all,但要确保它们不相互依赖。

答案 1 :(得分:0)

return await p[i - 1]

p.map函数中使用,在调用时无法使用。

你可能意味着:

return await a[i - 1]