Promise.allSettled 是最稳妥的并行异步处理方法,返回全 fulfilled 的 Promise,结果数组中每个元素含 status('fulfilled'/'rejected')及对应 value 或 reason;需配合超时控制避免 pending 卡死。

它返回一个全 fulfilled 的 Promise
调用 `Promise.allSettled(promises)` 后,返回的 Promise 永远不会被 reject,只会在所有输入 Promise 都进入终态(fulfilled 或 rejected)后 resolve。它的值是一个数组,每个元素都明确标注了对应任务的状态和数据:
- 成功项:
{ status: 'fulfilled', value: ... } - 失败项:
{ status: 'rejected', reason: ... }
适合需要逐个判断结果的批量操作
当你必须知道每一个请求是否成功、失败原因是什么、或者要分别统计成功率时,`allSettled` 比 `all` 更合适。典型场景包括:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 同时调用多个微服务接口,汇总用户资料、订单、权限等信息
- 预加载一组资源(图片、字体、脚本),记录哪些加载失败以便降级
- 表单中多个字段做异步校验(如用户名唯一性、邮箱格式验证),需展示全部错误提示
拿到结果后快速提取你需要的数据
返回的数组结构清晰,配合 `filter` 和 `map` 可以高效提取信息:
- 只取所有成功的值:
results.filter(r => r.status === 'fulfilled').map(r => r.value) - 只取所有失败的原因:
results.filter(r => r.status === 'rejected').map(r => r.reason) - 检查是否全部成功:
results.every(r => r.status === 'fulfilled') - 统计成功/失败数量:
results.filter(r => r.status === 'fulfilled').length
注意避免无限等待
`allSettled` 会一直等到所有 Promise 结束。如果其中某个 Promise 卡在 pending(比如没设超时的网络请求),整个流程就会挂起。建议为每个 Promise 加上超时控制:
const withTimeout = (promise, ms) =>
Promise.race([
promise,
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Timeout')), ms)
)
]);
const promises = urls.map(url => withTimeout(fetch(url), 5000));
Promise.allSettled(promises).then(...);


















