考虑这个简化的代码
;(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中,它什么都没有提供
问题:这有什么问题吗?
答案 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]