重复调用嵌入在init函数中的函数

时间:2016-06-28 15:08:00

标签: javascript node.js raspberry-pi

在这里Noobish。

我正在建立一个覆盆子项目,每5分钟测量一次水箱的深度。我已经在坦克中放置了一个超声波距离测量装置,并且使用节点和r-pi-usonic库来运行一切。我可以对超声波设备进行初始调用,以创建平均10个单独的测量值(由于各个测量值的可变性)并将其记录到控制台。

但我想做的是每隔5分钟重复一次。我最初尝试通过设置setInterval()来做到这一点,并尝试使用cron。但是由于查询循环在init函数中被绑定,它会抛出以下错误...

timers.js:274
callback.apply(this, args);
        ^
TypeError: Cannot read property 'apply' of undefined
at wrapper [as _onTimeout] (timers.js:274:13)
at Timer.listOnTimeout (timers.js:119:15)

所以我的问题是,每隔5分钟运行一次查询的最佳方法是什么?答案无疑将帮助我理解回调等等。抱歉这样的笨蛋!

我的代码在这里,为它的粗俗道歉!

//Import required modules

var usonic = require('r-pi-usonic');
console.log('starting water tank monitor');
var min_tank = 30
var max_tank = 90
var tank_percent = 0

usonic.init(function (error) {
    if (error) {
        console.log('Error')
    } else {
        var sensor = usonic.createSensor(13, 21, 1000);
        var i = 0
        var values = 0
        function  myLoop (){
            setTimeout(function () {    
                var v = sensor().toFixed(2) ;
                values = values+parseFloat(v);
                i++;                     
                if (i < 10) {            
                    myLoop();             
                } else {
                    value = (values/10).toFixed(2)                  
                    tank_percent = 100 -((value - min_tank )/ (max_tank - min_tank) * 100)
                    console.log(tank_percent);
                    i = 0;
                    values = 0;
                }                     
            }, 500)
        };
    setInterval (myLoop(), 30000);      
    }
});

3 个答案:

答案 0 :(得分:1)

当我看到(一个笑话)时,我的眼睛流血了:

setInterval (myLoop(), 30000);

注意您在myLoop中如何调用setInterval。按照目前的方式,您只需立即拨打myLoop()一次。您应该提供对myLoop函数的引用。

setInterval (myLoop, 30000);

一旦您正确使用了setInterval,您就不必在setTimeout内使用myLoop,因为setInterval是异步的。< / p>

答案 1 :(得分:0)

当您将myLoop作为参数传递给setInterval时,不应致电doc

function  myLoop (){
    setTimeout(function () {    
        var v = sensor().toFixed(2) ;
        values = values+parseFloat(v);
        i++;                     
        if (i < 10) {            
            myLoop();             
        } else {
            value = (values/10).toFixed(2)                  
            tank_percent = 100 -((value - min_tank )/ (max_tank - min_tank) * 100)
            console.log(tank_percent);
            i = 0;
            values = 0;
        }                     
    }, 500)
};
setInterval (myLoop, 30000);    

答案 2 :(得分:0)

谢谢!我要在岩石下爬行,永远不会再出来。