几乎相同的函数在$ interval循环上的行为不同

时间:2019-02-09 12:30:36

标签: angularjs cordova bluetooth-lowenergy cordova-plugins setinterval

我正在使用Cordova构建应用程序,该应用程序使用hereng-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");
    })
}

我试图做的是在指定的间隔时间内连续执行这两个功能。因此,我使用了angularJS的$interval服务并编写了以下代码。

    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()被连续调用。

这里还有bleReadisRinning()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);
     } 

对我来说代码似乎几乎相同,而且我不明白问题可能出在哪里。

P.S:我不知道这是否有帮助,但是我正在使用nodeJSbleno库来设置我的外围设备。贝娄是我设置这两个特征的方法,但是我仍然找不到任何可以解释$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);
                   })
               }
           })

编辑:

我发现了一些东西,但不确定为什么会发生。

因此,在函数getTemp()的onReadRequest的nodeJS端,如果响应(res)是只有一个属性的对象,例如{'status':'ok'},那么一切都按预期工作,如果我再为该对象添加一个属性,例如{'status':'ok', 'temp':23},那么整个过程就会崩溃。

EDIT.2:

所以这似乎是一个大小问题。如果对象的大小大于此{'temp':2455555555},则对象中只有一个属性都会崩溃。如果我再增加5的值,它就会发疯。

0 个答案:

没有答案