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

Javascript类调用Super并在回调中使用它,javascript,node.js,eslint,super,superclass,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) { ... c

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

基类:

/**
 * Basic sensor class
 */
class Sensor {
  /**
   * Constructor function
   * @param {object} options - sensor options
   * @param {*} callback - fn(err)
   */
  constructor(options, callback) {
    ...
    callback(null);
版本A(失败): 扩展类,在super的回调中调用:

ReferenceError:必须在访问“this”或从派生构造函数返回之前调用派生类中的超级构造函数

版本B(工作正常,但出现eslint错误):

错过了超类的构造调用

  constructor(options, callback) {
    async.series([
      (next) => super(options, next),
      (next) => {
        async.eachSeries(this.detectors,
有没有一种方法可以使用回调(避免
async/await
)调用
super
,并在回调中使用
this
?或者我应该忽略eslint错误,例如使用
//eslint禁用下一行构造函数super吗

您可以尝试将此in传感器绑定到您的回调,该回调将是扩展传感器的任何类的回调的
值(在箭头函数中不起作用)

    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{}
    });
  }
}

“两个类的构造函数都使用异步操作。”这是一个反模式。您可以说实现一些在创建实例后调用的
init
方法,或在创建实例之前执行异步操作的工厂方法。您需要确保在实例已初始化时始终异步调用回调。但正如尤里所说,实际的问题是(甚至是回电话)。@Bergi我理解链接中的讨论。我仍然不确定这对我来说有什么意义。传感器需要异步启动。我已经在一个类方法中进行了异步引导。我可以在
new
之后调用boot,但在那之前我的传感器仍然不可用。分离引导fn在imho中也没有多大意义,因为它使用类的方法。@Andiga当实例还不可用时,它如何使用类的方法?如果您认为这些是“内部方法”,而不必对实例是否“外部可用”进行任何处理,那么也许您应该将实现分开。否则,是的,在创建实例之后,在使用它之前调用
wait instance.boot()
,是一个合理的解决方案。(远不止在构造函数中执行异步操作)。
    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{}
    });
  }
}