我正在使用这种繁琐的逻辑:
function handle_register_after_pressed(){
if (typeof handle_register_after_pressed.sid !== "undefined" && ff_handle_register_after_pressed.sid)
{
clearInterval(handle_register_after_pressed.sid);
ff_handle_register_after_pressed.sid = 0;
}
handle_register_after_pressed.sid = setInterval(function(){},1000);
}
我想取消旧的 setInterval
并在再次调用该函数时重新启动它。
是否可以使用这种方式:
function handle_register_after_pressed(){
if (typeof handle_register_after_pressed.sid !== "undefined" )
{
clearInterval(handle_register_after_pressed.sid);
}
handle_register_after_pressed.sid = setInterval(function(){},1000);
}
所以我想问:
- 如果从
setTimeout
返回的 ID,clearInterval
是唯一的并且不断增加? - 在相同的返回 ID 上再次调用
setTimeout
、clearInterval
没有问题 - 当 id 为 0 或 null 或
undefined
时,我们也可以调用setTimeout
、clearInterval
而不会产生异常。
最佳答案
setInterval 的返回值只是一个唯一的数字,用于传回clearInterval。它不是一个具有任何附加信息的对象。
所以这段代码if (typeof handle_register_after_pressed.sid !== "undefined")
将不起作用,因为在执行clearInterval之后handle_register_after_pressed.sid不会被设置为undefined或null。
如果您想知道间隔是否已清除,您需要提出如下所示的自定义解决方案,
function mySetInterval(fn, interval) {
var id = setInterval(fn, interval);
this.cleared = false;
this.clear = function () {
this.cleared = true;
clearInterval(id);
};
}
然后这样调用它,
var t = new mySetInterval(function () {
console.log('this is a test');
}, 5000);
console.log(t.cleared); // false
t.clear();
console.log(t.cleared); // true
回答您的其余问题,
是的,setTimeout 和 setInterval 返回的 id 在当前网页的生命周期内是唯一的。此外,setInterval() 和 setTimeout() 使用的 ID 池是共享的,这意味着它是一个不断增加的计数器。
如果您对同一 ID 调用clearInterval,则没有问题。一旦生成了间隔 ID,即使清除该间隔(直到当前网页的生命周期),它也不会返回到 ID 池。
如果您使用无效参数(例如 null 或 undefined 或 0)调用clearInterval,它不会产生问题。它不会抛出任何异常。你很安全。
关于javascript - 我可以对同一个 id 调用两次clearInterval吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51317692/