如何从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
相关产品推荐
相关产品推荐

