重复调用embedded在init函数中的函数

Noobish在这里。

我正在build造一个树莓派项目,每5分钟测量一个水箱的深度。 我已经在坦克中放置了一个超声波距离测量装置,并且已经使用节点和r-pi-usonic库运行了所有的程序。 我可以先打电话给超声波设备,以创build平均10个单独的措施(由于个别措施的变化)并将其logging到控制台。

但我想要做的是每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分钟运行一次查询? 答案无疑会帮助我理解callback等。对不起,这样一个笨蛋!

我的代码在这里,为它的废话道歉!

 //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); } }); 

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

 setInterval (myLoop(), 30000); 

注意你在setInterval调用myLoop 。 以目前的方式,你立即调用myLoop()并且只需要调用一次。 你应该给你的myLoop函数的参考。

 setInterval (myLoop, 30000); 

一旦你正确使用了setInterval ,你将不必在你的myLoop使用setTimeout ,因为setInterval是asynchronous的。

当您将它作为parameter passing给setInterval ,请不要调用myLoop ,请参阅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); 

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