有没有办法检查clearTimeout是否成功。
我有一个javascript函数,它以30秒的间隔异步运行。它是一个自调用函数,使用setTimeout()在循环中重复自身。在特定情况下,我需要在某些事件发生后调用此函数。因此我首先clearTimeout并再次调用该函数。但是我不知道我是否能够成功清除之前的循环或者我现在开始了两个单独的循环。我可以这样做吗? :
if(clearTimeout(timer))
alert("cleared");
答案 0 :(得分:4)
“有没有办法检查clearTimeout是否成功。”
不,没有州可以检查,但是如果你正确管理你的计时器,那应该不是问题。
我想你可以创建自己的有状态计时器对象......
var _slice = Array.prototype.slice;
// substitute for setTimeout
function myTimer(fn,ms) {
var args = _slice.call(arguments,2),
timer_state = {
complete: false,
timer: setTimeout(function() {
timer_state.complete = true;
fn.apply(this, args);
}, ms)
};
return timer_state;
};
// substitute for clearTimeout
function clearMyTimer(timer_obj) {
timer_obj.complete = true;
clearTimeout(timer_obj.timer);
};
清除计时器的示例......
// create a timer
var timer = myTimer( function() {
console.log('timer is done');
}, 1000);
console.log( timer.complete ); // complete? false
clearMyTimer( timer ); // clear it
console.log( timer.complete ); // complete? true
让它运行的例子......
// create a timer
var timer = myTimer( function() {
console.log('timer is done');
}, 1000);
console.log( timer.complete ); // complete? false
// check the timer object after it has expired
setTimeout(function() {
console.log( timer.complete ); // complete? true
}, 1500);
编辑:更新以使this
在严格模式下保持一致,并支持传递给回调的其他参数。感谢@Saxoier注释。
答案 1 :(得分:1)
是的,这是使用闭包的状态。它很直接。
为了确保你没有像你说的那样一次又一次地调用它,你可以尝试这样的事情......
// declare only once, singleton concept using closure
(function() {
var timerReference,
timerMethod = function(fn) {
fn();
if (timerReference) {
window.clearTimeout(timerReference);
}
timerReference = window.setTimeout(function() {
timerMethod(fn);
}, 30000);
};
window.doTimer = function(fn) {
timerMethod(fn);
};
})();
// you can call this as many times as you like
doTimer(function() {
alert('hi');
});
doTimer(function() {
alert('hi again');
});
在这种情况下,调用doTimer()会破坏之前的前一个,这样你一次只能有一个计时器。
我也可以编写一个将它们排队的代码并等待最后一个完成,但那是另一个写法。