异步操作通常涉及到外部资源,如网络请求、定时器等。Promise取消机制需要能够正确管理和释放这些资源。实现一个通用且可靠的资源管理机制非常复杂,并且可能因不同的资源类型而异。
状态机:简单就是美
Rejected(已拒绝) :表示异步操作失败,并返回了一个原因(错误)。
一旦转换到Fulfilled或Rejected状态,Promise的状态就不可再改变。
Cancelled(已取消) :状态不可变。
链式操作:Promise通常被链式调用( .then().catch() )。如果一个中间的Promise被取消,如何处理后续链式操作也是一个难题。例如,Promise.all或Promise.race的行为如何改变?
const controller = new AbortController(); const signal = controller.signal; fetch('https://www.baidu.com', { signal }) .then(response => response) .then(data => console.log(data)) .catch(err => { if (err.name === 'AbortError') { console.log('Fetch aborted'); } else { console.error('Fetch error:', err); } }); // 堆代码 duidaima.com // 取消请求 controller.abort();自定义Promise包装器
class CancellablePromise { constructor(executor) { this._hasCanceled = false; this._promise = new Promise((resolve, reject) => { executor( value => this._hasCanceled ? reject({ canceled: true }) : resolve(value), reason => this._hasCanceled ? reject({ canceled: true }) : reject(reason) ); }); } cancel() { this._hasCanceled = true; } then(onFulfilled, onRejected) { return this._promise.then(onFulfilled, onRejected); } catch(onRejected) { return this._promise.catch(onRejected); } } // 使用自定义的CancellablePromise const cancellablePromise = new CancellablePromise((resolve, reject) => { setTimeout(() => resolve('Completed!'), 1000); }); cancellablePromise.then( result => console.log(result), err => { if (err.canceled) { console.log('Promise was canceled'); } else { console.error('Promise error:', err); } } ); // 取消Promise cancellablePromise.cancel();虽然标准的Promise没有内置取消功能,但可以通过这些方法来实现取消逻辑,根据实际需求选择合适的方案。