我想添加一个 cancel
Promise
的子类的方法内置。为什么这不起作用?
class CancellablePromise extends Promise {
constructor(executor) {
let cancel = null
super((resolve,reject) => {
cancel = reject
executor(resolve, reject)
})
this.cancel = cancel
}
}
const p = new CancellablePromise((resolve) => setTimeout(resolve, 1000))
.then(() => console.log('success'))
.catch((err) => console.log('rejected', err))
p.cancel() // Uncaught exception
答案是
Symbol.species
?
最佳答案
问题是 then
, catch
, 和 finally
创建并返回 新 promise ,他们创建和返回的新 promise 没有 cancel
方法就可以了。
要解决这个问题,您必须覆盖 then
所以它复制cancel
从当前实例到新实例:
class CancellablePromise extends Promise {
constructor(executor) {
let cancel = null;
super((resolve,reject) => {
cancel = reject;
executor(resolve, reject);
});
this.cancel = cancel;
}
then(onFulfilled, onRejected) {
const p = super.then(onFulfilled, onRejected);
p.cancel = this.cancel;
return p;
}
}
const p = new CancellablePromise((resolve) => setTimeout(resolve, 1000))
.then(() => console.log('success'))
.catch((err) => console.log('rejected', err));
p.cancel();
你不需要做
catch
或 finally
, 它们都是通过调用 then
来定义的(根据规范)。我应该注意到,围绕可取消的 promise 有很多细微差别,我没有详细介绍。可能值得深入阅读 Domenic Denicola's old (now withdrawn) cancellable promises proposal和 this article由本·莱什。
关于javascript - 使用 extends 子类化 Promise 内置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64155684/