1. 项目概述
在Node.js开发中,处理多个异步请求是家常便饭。最近我在重构一个电商平台的商品详情页时,遇到了一个典型场景:需要同时调用库存服务、评价服务和推荐服务三个接口,传统方案要么用Promise.all导致一个接口失败整个流程中断,要么用串行请求影响性能。经过反复测试对比,最终采用Promise.allSettled实现了既保证容错又确保性能的方案,接口响应时间从原来的1200ms降低到400ms左右。
这个方案特别适合需要同时处理多个独立API调用且对部分失败需要容错的场景,比如:
- 电商平台聚合多个微服务数据
- dashboard同时拉取多个统计指标
- 批量处理第三方API请求
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心原理与对比分析
2.1 Promise.allSettled工作机制
Promise.allSettled是ES2020引入的新特性,与Promise.all最大的区别在于:
- 不会因为某个Promise被reject而短路
- 总是等待所有Promise完成(无论成功失败)
- 返回结果数组中每个元素都是对象,包含status和value/reason
典型返回结构示例:
javascript复制[
{status: "fulfilled", value: "库存数据"},
{status: "rejected", reason: "评价服务超时"}
]
2.2 与传统方案对比
方案1:Promise.all
javascript复制// 任一请求失败会导致整个流程中断
Promise.all([getStock(), getReviews(), getRecommendations()])
.then(([stock, reviews, recs]) => { /*...*/ })
.catch(err => console.error('任一请求失败', err))
方案2:单独错误处理
javascript复制// 每个请求单独处理错误,但无法统一控制并发
const stock = await getStock().catch(e => null)
const reviews = await getReviews().catch(e => null)
const recs = await getRecommendations().catch(e => null)
方案3:Promise.allSettled(推荐)
javascript复制// 所有请求都会执行完毕,可统一处理结果
const results = await Promise.allSettled([
getStock(),
getReviews(),
getRecommendations()
])
const successfulData = results
.filter(r => r.status === 'fulfilled')
.map(r => r.value)
实测对比(100次请求平均值):
| 方案 | 成功率 | 平均耗时 | 错误处
