TwKit
正在载入
TwKit

一批异步任务里,有一个失败了,剩下的还要不要等?选 Promise 方法前,先把这个问题说清楚。 比如一个页面要同时拿到商品信息和库存,缺一份就无法继续展示… · @BaiBtw · TwKit

@BaiBtw

一批异步任务里,有一个失败了,剩下的还要不要等?选 Promise 方法前,先把这个问题说清楚。 比如一个页面要同时拿到商品信息和库存,缺一份就无法继续展示,可以用 Promise.all。它在全部成功后给出结果数组;只要有一个拒绝,整体就会拒绝。数组里的位置按传入顺序排列,不按谁先完成排列。 如果批量检查十个文件,希望知道每个文件的检查结果,用 Promise.allSettled 更合适。它等所有输入都结束,再逐项给出 fulfilled 或 rejected,以及对应的 value 或 reason。某一项失败,不会让其他项的结果消失,但也需要你自己处理失败项。 Promise.race 只看最先结束的那一个,成功和失败都算。拿请求与一个超时任务竞争,可以让调用方及时得到超时结果,却不代表网络请求已经停止。 这里最容易漏掉的是“结束等待”和“取消任务”的区别。Promise.all 提前拒绝,不会自动取消其他操作;race 分出结果,也不会替你停掉落后的任务。需要停止请求时,要使用底层支持的取消机制,例如配合 AbortController;请求先结束时,也别留下不再需要的定时器。 另外,Promise.all 接收的是任务产生的 Promise,直接把几个异步函数本身放进去,不会替你调用它们。先确认任务何时启动,再决定怎样收集结果。

曝光 4 · 评论 0 · 点赞 0 · 书签 0

查看原帖