gpt4 book ai didi

javascript - 重复调用嵌入 init 函数中的函数

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:03 25 4
gpt4 key购买 nike

这里是菜鸟。

我正在构建一个树莓派项目,每 5 分钟测量一次水箱的深度。我在水箱中放置了超声波测距仪,并使用 Node 和 r-pi-usonic 库让一切运行起来。我可以对超声波设备进行初始调用,以创建平均 10 个单独的测量值(因为各个测量值存在差异)并将其记录到控制台。

但我想做的是每 5 分钟重复一次。我最初尝试通过设置 setInterval() 来做到这一点,并尝试使用 cron。但由于查询循环被绑定(bind)在 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);
}
});

最佳答案

当我看到(笑话)时我的眼睛会流血:

setInterval (myLoop(), 30000);

注意您如何在 setInterval 中调用 myLoop。使用当前的方式,您可以立即调用 myLoop() 一次。您应该提供对 myLoop 函数的引用。

setInterval (myLoop, 30000);

正确使用 setInterval 后,您就不必在 myLoop 中使用 setTimeout,因为 setInterval 是异步的。

关于javascript - 重复调用嵌入 init 函数中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38079919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com