SOURCE

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 命令行工具 X clear

                    
>
console