Вызов метода класса из функции обратного вызова в JS

#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 in connectSensor ?

Ответ №1:

Теперь я понимаю, что проблема заключалась в том, что connectSensor в моем коде (но не в вопросе) находился за пределами инструкции «if». Следовательно, у первого обнаруженного устройства BLE (которое никогда не было предполагаемым датчиком) не был инициализирован элемент «sensor», и, следовательно, ошибка. В конце концов, это не имело никакого отношения к области действия ‘this’ или JavaScript. Я искренне сожалею, что трачу время каждого.