You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Promise.allSettled返回自定义结构的对象?

关于Promise.allSettled返回自定义对象的问题

你遇到的问题核心是Promise.allSettled的默认行为:它会把每个输入的Promise结果,统一包装成固定结构的对象——如果原Promise resolve,就返回{ status: "fulfilled", value: 原resolve值 };如果原Promise reject,就返回{ status: "rejected", reason: 原reject值 }。

你当前的代码里,每个entry.fn.then/catch其实都是一个永远resolve的Promise(因为catch捕获了所有错误),所以Promise.allSettled会把你的自定义对象放到value字段里,而不是直接返回它。这就是你遍历的时候只看到status的原因——自定义数据藏在value里。

两种解决办法:

办法一:从allSettled的结果中提取自定义对象

直接遍历allSettled返回的数组,取出每个元素的value即可:

let fns = [
  { fn: fn1, name: "myName1" },
  { fn: fn2, name: "myName2" },
];

const settledResults = await Promise.allSettled(
  fns.map((entry) =>
    entry.fn
      .then((res) => ({
        name: entry.name,
        status: "fulfilled",
        res: res.Data,
      }))
      .catch((err) => ({
        name: entry.name,
        status: "rejected",
        res: undefined,
      }))
  )
);

// 提取自定义对象数组
const allData = settledResults.map(item => item.value);

办法二:改用Promise.all(更直接)

既然你已经通过catch确保每个Promise都不会reject,完全可以用Promise.all替代allSettled,这样返回的就是直接的自定义对象数组,不需要额外处理:

let fns = [
  { fn: fn1, name: "myName1" },
  { fn: fn2, name: "myName2" },
];

const allData = await Promise.all(
  fns.map((entry) =>
    entry.fn
      .then((res) => ({
        name: entry.name,
        status: "fulfilled",
        res: res.Data,
      }))
      .catch((err) => ({
        name: entry.name,
        status: "rejected",
        res: undefined,
        err: err // 建议带上错误信息,方便排查问题
      }))
  )
);

总结

当然可以返回自定义对象,只是要注意Promise.allSettled的包装逻辑。如果不需要保留allSettled的原生状态结构,用Promise.all配合全局catch会更简洁。

内容的提问来源于stack exchange,提问作者user38643

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:20:13