#javascript #node.js #callback #this
#javascript #node.js #обратный вызов #это
Вопрос:
У меня проблема с областью действия ‘this’ в JS.
У меня есть функция обратного вызова, которая вызывает метод (connectSensor). В этом методе я пытаюсь изменить член класса, используя ‘this’. Однако я получаю
«Ошибка типа: не удается прочитать свойство ‘removeAllListeners()’ неопределенного».
Я думаю, поскольку метод вызывается изнутри обратного вызова, ‘this’ больше не относится к классу, но я не знаю, как это решить (т. Е. Иметь ссылку на класс внутри connectSensor). Я использую RPi 4 и Linux.
/* Perhipheral MAC. */
const SENSOR_MAC = "aa:aa:aa:aa:aa:aa";
class ble{
constructor(){
this.noble = require('noble');
this.sensor;
}
createEventHandlers(){
var noble = this.noble;
noble.on('stateChange', function(state)
{
/* Start scanning if Bluetooth is on. */
if( state == 'poweredOn' ) noble.startScanning();
});
noble.on('discover', function(peripheral){
if (perhipheral.address == SENSOR_MAC){
noble.stopScanning();
this.sensor = peripheral;
console.log("Discovered the sensor: " this.sensor.name)
/* Here 'this' is bound to the class. */
this.connectSensor();
}
}.bind(this));
}
connectSensor(){
/* I want 'this' here to always refer to the class. */
this.sensor.removeAllListeners();
}
}
Использование:
bleClass = new ble();
bleClass.createEventHandlers();
Комментарии:
1. Вы действительно подтвердили, что это
peripheral
неundefined
так?2. Я так думаю. Когда я комментирую «this.connectSensor();», программа выводит «Обнаружен датчик». и остается там. Когда я его раскомментирую, я получаю сообщение об ошибке, но, что интересно, сообщение не печатается. Я не уверен, почему. (Я должен признать, что я не знаю, как работает движок JE).
3. Таким образом, «датчик» определен в обратном вызове, поскольку я не получаю ошибку «… of undefined» при использовании «this.sensor.name «, но в «connectSensor» «this» (к чему бы это ни относилось) не имеет элемента «sensor» / не определено.
4. Какую версию node и noble вы используете? Вы можете проверить с помощью
node -v
иnpm ls noble
соответственно.5. «у «этого» (к чему бы оно ни относилось) нет элемента «sensor» / не определено». Какова ценность
this
inconnectSensor
?
Ответ №1:
Теперь я понимаю, что проблема заключалась в том, что connectSensor в моем коде (но не в вопросе) находился за пределами инструкции «if». Следовательно, у первого обнаруженного устройства BLE (которое никогда не было предполагаемым датчиком) не был инициализирован элемент «sensor», и, следовательно, ошибка. В конце концов, это не имело никакого отношения к области действия ‘this’ или JavaScript. Я искренне сожалею, что трачу время каждого.