почти одинаковые функции ведут себя по-разному в $ интервальном цикле - PullRequest
0 голосов
/ 09 февраля 2019

Я создаю приложение с использованием Cordova, которое использует найденную библиотеку ng-cordova-bluetoothle здесь .

У меня две основные функции:

function isRunning(){

    return bleReadisRunning()
    .then (function(response){
        response = atob(response.value);
        debugWrite("Response@isRunning: " + response + "\n");
        if(response.status){
            // Do nothing
        } else{
            // Stop the loop
        }
        return response;
    })
    .catch( function(error){
        console.log("isRunning");
    });
}

function getTemp(){
    return bleReadgetTemp()
    .then (function(response){
        response = atob(response.value);
        debugWrite("Response@getTemp: " + response + "\n");
        if(response.status){
            // Do nothing
        } else {
            // Stop the loop :p
        }
        return response;
    })
    .catch( function(error){
        console.log("getTemp");
    })
}

Я пытался выполнять эти две функции непрерывно с определенным интервалом времени.По этой причине я использовал сервис $interval от angularJS и написал следующий код:

    vm.startExperimentLoop = function() {
       vm.myCall = $interval( loop, 5000);        
    };


    vm.apiStop = function(){
        $interval.cancel(vm.myCall);
    }

Сначала я попытался использовать только isRunning() в функции loop(), такой как:

function loop(){
    isRunning();
}

После тестирования все заработало как положено.Звонок isRunning() происходил каждые 5 секунд.Но если я изменяю функцию loop() и заставляю ее запускать getTemp(), кажется, что этот интервал в 5 секунд не сохраняется, и getTemp() вызывается непрерывно.

Здесь также находятся *Функции 1024 * и bleReadgetTemp().

     function bleReadisRunning(){
        var service_id = '12ab';
        var characteristic_id = '32cd';

        var params = {
            address: $stateParams.address,
            service: service_id,
            characteristic: characteristic_id,
        };

        return $cordovaBluetoothLE.read(params);
     }

     function bleReadgetTemp(){
        var service_id = '12ab';
        var characteristic_id = '31cd';

        var params = {
            address: $stateParams.address,
            service: service_id,
            characteristic: characteristic_id,
        };

        return $cordovaBluetoothLE.read(params);
     } 

Код кажется мне почти одинаковым, и я не могу понять, в чем проблема.

PS: я не знаю, помогает ли это, но я использую библиотеки nodeJS и bleno для настройки моего периферийного устройства.Ниже приводится способ настройки двух характеристик, но, опять же, я не могу найти какой-либо большой разницы, которая могла бы объяснить проблему с помощью $interval.

            // IS RUNNING CHARACTERISTIC
            new bleno.Characteristic({
             value: null,
             uuid: settings.is_running_characteristic_id,
             properties: ['read'],
             onReadRequest: function(offset, callback){
                isExperimentRunning()
                .then( (res) => {
                    var buffer = Buffer.from( JSON.stringify(res) );
                    callback(this.RESULT_SUCCESS, buffer);
                })
             }
           }),
           // GET TEMP CHARACTERISTIC
           new bleno.Characteristic({
               value:null,
               uuid: settings.get_temp_characteristic_id,
               properties: ['read'],
               onReadRequest: function(offset, callback){
                   getTemp()
                   .then( (res) => {
                       var buffer = Buffer.from( JSON.stringify(res) );
                       callback(this.RESULT_SUCCESS, buffer);
                   })
               }
           })

РЕДАКТИРОВАТЬ:

Я нашел что-то, но не уверен, почему это происходит.

Так что на стороне nodeJS в функции getTemp(), которая является onReadRequest, если ответ (res) является объектом только с одниматрибута, например, {'status':'ok'}, тогда все работает как положено, если я добавлю еще один атрибут к этому объекту, например {'status':'ok', 'temp':23}, тогда весь процесс развалится.

EDIT.2:

Так что, похоже, это вопрос размера.Либо с одним атрибутом в объекте произойдет сбой, если размер объекта будет больше, чем {'temp':2455555555}.Если я добавлю еще 5 к значению, это сойдет с ума.

...