重复调用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);
谢谢! 我要爬在岩石下,永远不会再出来。