我用机器人控制Raspberry Pi,并在实施前模拟所有功能。
function onFunction() {
console.log("LED ON");
}
function offFunction() {
console.log("LED OFF");
}
// blink:
function loop(){
onFunction();
setTimeout(offFunction, 500);
setTimeout(function(){ loop() }, 1000);
}
当我调用另一个函数时,我需要停止此循环:
bot.hears(/off/i, (ctx) => {
//break blink;
offFunction();
});
我试图使用标签并打破,但它似乎不适用于功能。只有for,while循环。
答案 0 :(得分:1)
setTimeout
函数(及其对应的setInterval
)返回timeoutId。
这必须与函数clearTimeout
一起使用才能取消超时(类似地,clearInterval
取消间隔)。
因此,代码应该成为
var loopTimeout;
var offTimeout;
function onFunction() {
console.log("LED ON");
}
function offFunction() {
console.log("LED OFF");
}
// blink:
function loop(){
onFunction();
offTimeout = setTimeout(offFunction, 500);
loopTimeout = setTimeout(function(){ loop() }, 1000);
}
bot.hears(/off/i, (ctx) => {
//break blink;
clearTimeout(offTimeout); // To try and prevent two 'offFunction' invocations
clearTimeout(loopTimeout); // To clear the loop
offFunction();
});
答案 1 :(得分:0)
这种不雅的解决方案将是一个简单的杀戮旗帜:
let kill = false;
function loop(){
if(kill) return;
onFunction();
setTimeout(offFunction, 500);
setTimeout( loop, 1000);
}
bot.hears(/off/i, (ctx) => {
kill = true;
offFunction();
});
或者你可以使用一个间隔并停止:
let isOn = false;
const blinking = setInterval(() => {
console.log(`LED ${(isOn =! isOn) ? "ON": "OFF"}`);
}, 500);
bot.hears(/off/i, (ctx) => {
clearInterval(blinking);
});
也可以使用promises来做到这一点:
const stop = new Promise((_, rej) => bot.hears(/off/i, rej));
const timer = ms => new Promise(res => setTimeout(res, ms);
(async function(){
while(true){
console.log("LED ON");
await timer(500);
console.log("LED OFF");
await Promise.race([ timer(500), stop ]);
}
})()
答案 2 :(得分:0)
您还可以定义一个计时器,在循环的setTimeout中使用,然后在需要时清除它。
var timer; // <-- define timer
function onFunction() {
console.log("LED ON");
}
function offFunction() {
console.log("LED OFF");
}
function loop(){
onFunction();
setTimeout(offFunction, 500);
timer = setTimeout(function(){ loop() }, 1000); // <-- assign timer
}
bot.hears(/off/i, (ctx) => {
//break blink;
offFunction();
clearTimeout(timer); // <-- clear timer
});
;-)希望这有帮助