2016-09-05 2 views
3

При использовании ECMAScript 6 и классов можно ли вызвать метод суперкласса из метода расширенного класса после завершения асинхронного вызова?JavaScript ES6 Call to «super» После асинхронного вызова

Здесь не является абстрактным вопросом в коде:

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() приведет к ошибке, потому что супер больше не относится к суперклассу Foo и не определен внутри Перезвони.

Я пытался сохранить ссылку на супер до обратного вызова и использовать эту ссылку в функции обратного вызова после его завершения, но это не похоже на работу например .:

myMethod() { 
    var mySuper = super; 

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

Возможно ли это?

+2

Просто говоря: синхронный метод не должен быть перезаписан асинхронным. И вы почти всегда должны делать обратный вызов или возвращать обещание. – Bergi

+0

@Bergi True true (upvoted). Это был просто надуманный пример, чтобы показать конкретный сценарий, а не лучшую практику. –

ответ

6

функции Стрелка сохранит все лексические ссылки, а не только this, так что вы можете использовать один для доступа super тоже:

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

Вы не можете держать ссылку на super, но вы можете функции:

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

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

Я буквально просто пробовал это, так как ваш ответ всплыл, и он работает :) - потрясающе. –

+0

Видимо, я должен подождать 11 минут, чтобы отметить ваш ответ как правильный. Кажется немного глупым, когда это, безусловно, правильный ответ! –

+1

@RobEvans: Кроме того, теперь есть гораздо лучший ответ. – Bergi

Смежные вопросы