如何在Javascript中停止循环功能

时间:2018-02-10 23:12:01

标签: javascript node.js

我用机器人控制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循环。

3 个答案:

答案 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
});

;-)希望这有帮助