Promise.any() 挑的是“第一个成功的”,不是“第一个结束的”。这俩差一个词,结果能差一大截。 假设三个任务一起跑:一个立刻失败,一个100毫秒成… · @BaiBtw · TwKit
@BaiBtw
Promise.any() 挑的是“第一个成功的”,不是“第一个结束的”。这俩差一个词,结果能差一大截。 假设三个任务一起跑:一个立刻失败,一个100毫秒成功,另一个500毫秒成功。 • any:忽略先来的失败,拿100毫秒那个成功值。 • race:谁先结束就跟谁,失败也算,所以这里直接失败。 • all:要所有输入都成功,给的是结果数组,不是挑一个赢家。 any 接收可迭代对象,返回一个新的 Promise。它适合“给我一个成功结果就够了,谁给的不重要”的场景,不用等其余任务全收工。 比如同时获取 coffee.jpg 和 tea.jpg,分别检查响应是否正常,再读取成 blob。把这两个任务交给 any,谁先完成这整段流程,就先把谁变成图片显示。注意:判断成功的位置是读取完 blob,不是只收到响应头;HTTP 异常也要在任务里明确抛错。 失败这边有两个坑: 1. 全部失败,才以 AggregateError 拒绝;各个失败原因放在 errors 里,按输入顺序排列,不按谁先报错排列。 2. 空数组也会失败,因为根本没有一个能成功的候选;它返回的是已经拒绝的 Promise。非空输入即使都已结束,结果仍异步确定。 再补个容易误会的边界:拿到赢家,不代表其他任务被取消。 any 不会替你停掉剩余操作,也不会自动拆掉已经挂上的处理函数。反复把同一个长期 pending 的 Promise 塞进去,即便每轮都有别的任务获胜,处理函数仍可能越攒越多。后续输入的拒绝会被处理,不会因此触发 unhandledrejection,但工作本身照样可能继续跑。 一句话:any 是“等一个成功”,不是“所有成功”,也不是“赢家出来,其他人自动下班”。
曝光 16 · 评论 0 · 点赞 1 · 书签 0
查看原帖