function abortablePromise(fn, signal) {
return new Promise((resolve, reject) => {
// 如果信号已中断
if (signal.aborted) {
return reject(new DOMException('Aborted', 'AbortError'));
}
// 监听中断事件
const onAbort = () => reject(new DOMException('Aborted', 'AbortError'));
signal.addEventListener('abort', onAbort, { once: true });
// 执行异步函数
fn(resolve, reject).finally(() => {
signal.removeEventListener('abort', onAbort);
});
});
}
// 使用示例
const controller = new AbortController();
abortablePromise((resolve) => {
setTimeout(() => resolve('Success!'), 2000);
}, controller.signal)
.then(console.log)
.catch(err => {
if (err.name === 'AbortError') {
console.log('Promise aborted');
}
});
// 中断 Promise
setTimeout(() => controller.abort(), 1000);
// 与 Fetch API 无缝集成
// const controller = new AbortController();
// fetch('/api', { signal: controller.signal });
// controller.abort(); // 中断请求
console