Javascript Class 调用 Super 并在回调中使用它
Javascript Class Call Super And Use This in Callback
我有一个传感器 class 和一个扩展它的 class。两个 classes 的构造函数都使用异步操作。
基础class:
/**
* Basic sensor class
*/
class Sensor {
/**
* Constructor function
* @param {object} options - sensor options
* @param {*} callback - fn(err)
*/
constructor(options, callback) {
...
callback(null);
版本 A(失败):
扩展 class,在 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
您可以尝试在 Sensor 中将此绑定到您的回调,这将是任何 class 扩展 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{}
});
}
}
我有一个传感器 class 和一个扩展它的 class。两个 classes 的构造函数都使用异步操作。
基础class:
/**
* Basic sensor class
*/
class Sensor {
/**
* Constructor function
* @param {object} options - sensor options
* @param {*} callback - fn(err)
*/
constructor(options, callback) {
...
callback(null);
版本 A(失败): 扩展 class,在 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
您可以尝试在 Sensor 中将此绑定到您的回调,这将是任何 class 扩展 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{}
});
}
}