为什么JavaScript没有原生的方式,在一个Promise失败时就取消Promise.all?
我正在进行多项异步操作,使用 Promise.all:
const promises = [
fetch("/api/1"),
fetch("/api/2"),
fetch("/api/3"),
];
await Promise.all(promises);
据我知,如果其中一个Promise被拒绝,Promise.all 会立刻被拒绝。
然而,其他的Promise仍在后台继续执行。
在某些情况下,如果其中一个失败,我不希望剩余的操作继续进行。
在这种情况下,是否有内置的或推荐的模式来停止或取消剩余的异步操作?
解决方案
你不能直接取消Promise,但如果底层的异步操作支持取消,你就可以取消它们(例如,通过 AbortController 来取消 fetch)。
关键在于让所有请求共享同一个 AbortSignal,这样就能一起取消它们。
const controller = new AbortController();
const { signal } = controller;
const promises = [
fetch("/api/1", { signal }),
fetch("/api/2", { signal }),
fetch("/api/3", { signal }),
];
try {
await Promise.all(promises);
} catch (err) {
controller.abort(); // cancel remaining requests
throw err;
}
自定义的异步代码不支持AbortController,必须手动实现。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。