【问题标题】:Promise.all does not resolve promises as expectedPromise.all 没有按预期解决承诺
【发布时间】:2021-12-20 12:49:35
【问题描述】:

由于某种原因,这按预期工作:

  const metadatasExternal = await Promise.all(
    NFTs.map(n => axios.get(n.metadataOnchain?.data.uri!))
  )

但这不是:

  const metadatasExternal = await Promise.all(
    NFTs.map(n => ({
      metadataPDA: n.metadataPDA,
      metadataExternal: axios.get(n.metadataOnchain?.data.uri!),
    }))
  )

具体来说,承诺没有得到解决。这就是我得到的回报:

  {
    metadataPDA: PublicKey {}
    metadataExternal: Promise { <pending> }
  },

这是为什么呢?我该如何解决?我特别需要在每个 promise 中包含 metadataPDA 键,否则我无法将它们与代码中的另一个数据结构匹配。

【问题讨论】:

  • 好吧,为什么要这样呢? axios.get 是返回承诺的那个。您已经将这个承诺隐藏在一个对象键中,并且永远不会等待它。 Promise.all 期望它等待的 promise 数组。然而,你给了它一个普通对象的数组!

标签: typescript promise


【解决方案1】:

您需要为Promise.all 提供一系列承诺。在您的第二个 sn-p 中,您将它提供给一组普通对象,并在其中一个键中提供一个承诺。 Promise.all 不懂魔法,也无法等待你隐藏在所述对象中的承诺。

相反,请确保您在map-中返回承诺-

const metadatasExternal = await Promise.all(
    NFTs.map(async n => {
        const data = await axios.get(n.metadataOnchain?.data.uri!);
        return { metadataPDA: n.metadataPDA, metadataExternal: data };
    })
);

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2022-08-20
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2023-01-21
    • 2018-10-08
    • 2019-12-03
    相关资源
    最近更新 更多