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

