【问题标题】:Link to a promise of async function inside of it链接到其中的异步函数承诺
【发布时间】:2022-02-06 23:06:48
【问题描述】:

考虑一下这个简化的代码

;(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 is not defined”

在 Firefox 中它什么也没提供

问题:有什么问题吗?

【问题讨论】:

  • 这段代码有什么意义?
  • 如果您可以(也)发布您的实际代码,而不仅仅是这个简化的代码,这可能会有所帮助。

标签: javascript async-await


【解决方案1】:

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

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

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

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

for (const v of a)
  await 1;

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

【讨论】:

  • 这是一个简化的例子,所以实际上在前面的行中等待是我需要的。谢谢
【解决方案2】:
return await p[i - 1]

p.map函数内部使用,调用时不可用。

你的意思可能是:

return await a[i - 1]

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 2017-10-22
    • 2019-01-15
    • 1970-01-01
    • 2022-01-26
    • 2018-09-07
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多