javascript - 使用 extends 子类化 Promise 内置

标签 javascript ecmascript-6 promise es6-class cancellation

我想添加一个 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();

你不需要做catchfinally , 它们都是通过调用 then 来定义的(根据规范)。
我应该注意到,围绕可取消的 promise 有很多细微差别,我没有详细介绍。可能值得深入阅读 Domenic Denicola's old (now withdrawn) cancellable promises proposalthis article由本·莱什。

关于javascript - 使用 extends 子类化 Promise 内置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64155684/

相关文章:

javascript - 我如何命名 SystemJS 包

javascript - 如何从常规字符串构造模板字符串?

javascript - 调用异步函数内部有更多的异步函数

javascript - 如何将回调 hell 重写为 promise ?

javascript - 启动带参数的函数

javascript - 使用javascript控制点(.)符号的整数验证

reactjs - 组件定义 React 中 Babel 语法错误

javascript - 在 JavaScript 函数中执行 Firestore 查询

javascript - Uncaught ReferenceError : date is not defined | JavaScript NodeJs jQuery FileSystem

Javascript 乘法对于某些数字不能正常工作