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

如何获取Promise集合中所有已解决实例并跳过拒绝的Promise?

实现返回所有已解决Promise并跳过拒绝实例的方案

当然可以实现这个需求!核心逻辑就是让每个传入的Promise永远不会触发拒绝状态,这样Promise.all就能正常等待所有实例完成,之后我们再从结果集中过滤掉那些原本被拒绝的项即可。

手动封装实现

如果你的运行环境还不支持ES2020的Promise.allSettled,可以手动封装一个函数:

function promiseAllGetResolved(promises) {
  // 先把所有项转成Promise,确保统一处理
  const wrappedPromises = promises.map(p => 
    Promise.resolve(p)
      .then(result => ({ status: 'fulfilled', value: result }))
      .catch(error => ({ status: 'rejected', reason: error }))
  );

  // 等待所有包装后的Promise完成,再过滤出成功的结果
  return Promise.all(wrappedPromises)
    .then(results => results.filter(item => item.status === 'fulfilled'));
}

基于ES2020的简洁实现

ES2020引入的Promise.allSettled方法正好解决了“等待所有Promise完成,不管成功失败”的问题,我们直接基于它来过滤结果就行,代码更简洁:

function getOnlyResolvedPromises(promises) {
  return Promise.allSettled(promises)
    .then(results => results.filter(item => item.status === 'fulfilled'));
}

使用示例

不管用哪种实现,调用方式都很简单:

const testPromises = [
  Promise.resolve('成功结果1'),
  Promise.reject('这个Promise失败了'),
  123, // 非Promise值也能被正确处理
  Promise.resolve('成功结果2')
];

getOnlyResolvedPromises(testPromises)
  .then(resolved => {
    console.log('所有成功的Promise结果:', resolved);
    // 输出:[{ status: 'fulfilled', value: '成功结果1' }, { status: 'fulfilled', value: 123 }, { status: 'fulfilled', value: '成功结果2' }]
  });

补充说明

这个问题属于社区常见的重复问题,核心思路都是通过包装Promise避免Promise.all因单个拒绝而中断,再通过过滤得到仅成功的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:03:06