【问题标题】:Setting instance members before super() call finishes在 super() 调用完成之前设置实例成员
【发布时间】:2019-01-25 21:47:12
【问题描述】:

我决定我需要某种可取消的承诺,所以我尝试自己编写它。但是,我陷入了无法在 super() 调用完成之前设置实例成员的问题——为了扩展 Promise,可能需要在 super() 之前设置一些东西。

所以,我的问题是:有没有一种简单的方法可以在不重写整个 Promise 功能的情况下实现这一目标?

export class CancelablePromise<T> extends Promise<T> {
    private onCancel: () => void = () => {};

    public constructor(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void, oncancel: (handler: ()=>void)=>void) => void) {
        super( (res, rej) => {
            executor(res, rej, ( handler: () => void) => { this.onCancel = handler ; });
        });
    }

    public Cancel(): void {
        this.onCancel();
    }
}

【问题讨论】:

    标签: javascript typescript promise


    【解决方案1】:

    您可以使用局部变量 - 收集解析器函数:

    constructor(executor) {
        let resolve, reject;
        super((res, rej) => { resolve = res; reject = rej; });
        try {
            executor(resolve, reject, handler => { this.onCancel = handler ; });
        } catch(e) {
            reject(e);
        }
    }
    

    或在创建属性之前存储处理程序:

    constructor(executor) {
        let onCancel; // = default handler
        super((resolve, reject) => {
            executor(resolve, reject, handler => { onCancel = handler; });
        });
        this.onCancel = onCancel;
    }
    

    【讨论】:

    • 我不能。在 Javascript 中,这是可行的;但在 Typescript 中,它提高了 TS2376:A 'super' call must be the first statement.
    • That's a bug :-) 也许你可以尝试在super() 调用之后用var 声明变量?
    • 是的,我在您发表评论之前发现了它:) 我不确定在 super() 调用之后声明 var 会创建一个闭包。我将通过在纯 javascript 中实现它并创建 d.ts 文件来解决这个问题。
    • 是的,变量被提升了,所以闭包总是被创建。如果不是,则分配将在严格模式下引发错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多