Javascript类调用Super并在回调中使用它

时间:2019-07-18 09:31:21

标签: javascript node.js eslint super superclass

我有一个传感器类和一个扩展它的类。这两个类的构造函数都使用异步操作。

基类:

/**
 * Basic sensor class
 */
class Sensor {
  /**
   * Constructor function
   * @param {object} options - sensor options
   * @param {*} callback - fn(err)
   */
  constructor(options, callback) {
    ...
    callback(null);

版本A(失败): 扩展类,在super的回调中调用它:

ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor

/**
 * Mock of the Chirp water level sensor.
 */
class ChirpSensorMock extends SensorMock {
  /**
   * Constructor function
   * @param {object} options - sensor options
   * @param {*} callback - fn(err)
   */
  constructor(options, callback) {
    super(options, (err) => {
      if (err) { return callback(err); }
      async.eachSeries(this.detectors,

版本B(可以运行,但出现eslint错误):

Missed superclass's construction invocation

  constructor(options, callback) {
    async.series([
      (next) => super(options, next),
      (next) => {
        async.eachSeries(this.detectors,

有没有一种方法可以使用回调(并避免使用async/await来调用super并在回调中使用this?还是我应该忽略eslint错误,例如与// eslint-disable-next-line constructor-super

1 个答案:

答案 0 :(得分:1)

您可以尝试在Sensor中将此绑定到您的回调,这将是扩展Sensor的任何类的callback(将无法在箭头函数中使用)的this

    class Sensor {
  /**
   * Constructor function
   * @param {object} options - sensor options
   * @param {*} callback - fn(err)
   */
  constructor(options, callback) {
    ...
    callback.call(this,null);
  }
}

class ExtendSensor extends Sensor{
  constructor(){
    super(option, function(v){
    console.log(v, this) //v == null, this == ExtendSensor{}
    });
  }
}