Promise.all、allSettled、race、any 怎么选
先理解原理和示例,再练习完整口述与追问。
回答要点
- all:全部成功才成功,结果保持输入顺序,任一拒绝会使聚合结果拒绝。
- allSettled:等待全部结束,分别拿成功或失败状态。
- race:采用最先敲定的结果;any:采用最先兑现的结果,全部拒绝时拒绝。
- 聚合 Promise 失败不会自动取消其他任务;并行请求也不等于具备并发数量限制。
原理拆解
这些组合器只组织输入 Promise 的结果,不自动控制底层任务何时开始或取消。all 等待全部成功,按输入顺序返回结果,任一拒绝就拒绝;allSettled 等全部结束并保留每个状态;race 接受第一个完成的结果,包括拒绝;any 接受第一个成功结果,全部失败才以 AggregateError 拒绝。输入普通值也会被按 Promise 规则采纳。
示例与推演
两个请求中 A 花 300ms、B 花 100ms,Promise.all([A,B]) 仍返回 [A结果,B结果],不是完成顺序。详情页的多个必需接口适合 all,互不影响的批量操作结果展示适合 allSettled,多个等价镜像择优可用 any。空输入时 all 与 allSettled 成功得到空数组,any 拒绝,race 永久保持 pending。
易错点
all 提前拒绝不代表其他请求已停止;race 超时也不会自动取消原请求。要限制并发,应延后调用任务函数,不能先创建全部 Promise 再声称已经限流。
参考回答可直接练习口述
多个结果都成功才能继续时用 Promise.all,它按输入顺序返回结果,有一个拒绝时聚合结果就拒绝;需要收集每项成败时用 allSettled。race 采用第一个敲定的结果,成功或失败都算;any 等待第一个兑现,只有全部拒绝才以 AggregateError 拒绝。all([]) 得到空结果,allSettled([]) 也是空结果,any([]) 拒绝,race([]) 保持 pending。它们都不会自动停止底层任务,也不会自动限制并发。