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