var a = function(bool){
(function b(bool){
if(bool === true || bool === undefined){
console.log('running');
setTimeout(b,50);
}else{
clearTimeout(b);
}
})();
}
我已经知道这可能比setInterval
好,但清除此功能不起作用。我已经尝试过break和return,并且它会一直循环遍历console.log
有关如何轻松取消此功能的任何建议吗?
我尝试过什么
if(bool === true || bool === undefined){
console.log('running');
setTimeout(b,50);
}else{
return;
}
var d;
if(bool === true || bool === undefined){
console.log('running');
d=setTimeout(b,50);
}else{
clearTimeout(d);
}
答案 0 :(得分:5)
clearTimeout
(MDN)期望“timeoutID”而不是函数作为参数:
var id = setTimeout(b,50);
clearTimeout(id);
但是,当我仔细查看您的代码时,似乎还有另一个问题:
setTimeout(b,50);
您正在调用b
而没有任何参数,因此函数参数bool
将始终为undefined
!试试这个:
setTimeout(function () {
b(false);
},50);
然后它应该只迭代一次。然后你根本不需要清除超时(你只是停止设置新的超时):
var a = function(bool){
(function b(bool){
if(bool === true || bool === undefined){
console.log('running');
setTimeout(function () {
var goOn = false; //<--- abort condition here
b(goOn);
},50);
}
})();
}
现在你只需弄清楚你的中止条件是什么,并把它带到正确的地方。
编辑(回答您的评论)
看起来你只想要一个启动间隔的函数和一个停止它的函数。所以接下来是这种设置的最小例子(也计算迭代次数)。根据自己的需要调整它应该相当容易。
var goOn = false,
counter = 0;
function run() {
counter++;
if (goOn) {
setTimeout(run, 50);
}
}
function start() {
counter = 0;
goOn = true;
run();
}
function stop() {
goOn = false;
console.log(counter);
}