李恒道 发表于 2022-9-15 10:03
这是中断fetch的吧
Promise也可以,只是得手动实现?更多应该是一个规范,用它提供的接口去判断
/**
 * 自定义的可以主动取消的 Promise
 */
function myCoolPromise ({ signal }) {
    return new Promise((resolve, reject) => {
        // 如果刚开始 signal 存在并且是终止的状态可以直接抛出异常
        signal?.throwIfAborted();
        // 异步的操作,这里使用 setTimeout 模拟
        setTimeout(() => {
            Math.random() > 0.5 ? resolve('ok') : reject(new Error('not good'));
        }, 1000);
        // 添加 abort 事件监听,一旦 signal 状态改变就将 Promise 的状态改变为 rejected
        signal?.addEventListener('abort', () => reject(signal?.reason));
    });
}
/**
 * 使用自定义可取消的 Promise
 */
const ac = new AbortController();
const { signal } = ac;
myCoolPromise({ signal }).then((res) => console.log(res), err => console.warn(err));
setTimeout(() => {
    ac.abort();
}, 100); // 可以更改时间看不同的结果