clearTimeout 成功了吗?

roo*_*unk 5 javascript

有没有办法检查 clearTimeout 是否成功。

我有一个 javascript 函数,它以 30 秒的间隔异步运行。它是一个自调用函数,并使用 setTimeout() 在循环中重复自身。在特定情况下,我需要在某个事件发生后调用此函数。因此我首先 clearTimeout 并再次调用该函数。但我不知道我是否能够成功清除前一个循环,或者我现在开始了两个单独的循环。我可以做这样的事情吗?:

if(clearTimeout(timer))
alert("cleared");
Run Code Online (Sandbox Code Playgroud)

小智 5

“有没有办法检查 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);
};
Run Code Online (Sandbox Code Playgroud)

清除计时器的示例...

  // 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
Run Code Online (Sandbox Code Playgroud)

让它运行的例子......

  // 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);
Run Code Online (Sandbox Code Playgroud)

编辑:更新以this在严格模式下保持一致,并支持传递给回调的附加参数。感谢@Saxoier的注释。