JavaScript ES6在异步调用后调用“超级”

时间:2016-09-05 11:17:21

标签: javascript class ecmascript-6

使用ECMAScript 6和类时,是否可以在异步调用完成后从扩展类方法调用超类方法?

以下是代码中问题的摘要:

class Foo {
    constructor () {

    }

    myMethod (data) {
        console.log('Data was: ', data);
    }
}

class Bar extends Foo {
    constructor () {
        super();
    }

    myMethod () {
        database.getDataForId('wth4308g40giemwfo', function (err, data) {
            super.myMethod(data);
        });
    }
}

使用上面的类Foo.myMethod()会导致错误,因为super不再引用Foo的超类,并且在回调中未定义。

我试图在回调之前保留对super的引用,并在回调完成后在回调中使用该引用,但这似乎不起作用,例如:

myMethod () {
    var mySuper = super;

    database.getDataForId('wth4308g40giemwfo', function (err, data) {
        mySuper.myMethod(data);
    });
}

有可能吗?

2 个答案:

答案 0 :(得分:5)

箭头函数将保留所有词汇引用,而不仅仅是this,因此您也可以使用一个来访问super

myMethod () {
    database.getDataForId('wth4308g40giemwfo', (err, data) => {
        super.myMethod(data);
    });
}

答案 1 :(得分:2)

您不能保留对super的引用,但您可以使用以下功能:

myMethod () {
    var myMethod = super.myMethod;
    var self = this;

    database.getDataForId('wth4308g40giemwfo', function (err, data) {
        myMethod.call(self, data);
    });
}