我有一个传感器类和一个扩展它的类。这两个类的构造函数都使用异步操作。
基类:
/**
* 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”或从派生构造函数返回之前必须调用派生类中的 super 构造函数
/**
* 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 错误):
错过了父类(super class)的构造调用
constructor(options, callback) {
async.series([
(next) => super(options, next),
(next) => {
async.eachSeries(this.detectors,
有没有办法使用回调(并避免async/await
)来调用super
并在回调中使用this
?或者我应该忽略 eslint 错误,例如with //eslint-disable-next-line constructor-super
最佳答案
您可以尝试将 Sensor 中的 this 绑定(bind)到您的回调,该回调将是扩展 Sensor 的任何类的回调的 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{}
});
}
}
关于Javascript 类调用 Super 并在回调中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57091359/