有没有办法检查 var 是否正在使用 setInterval()?

问题描述 投票:0回答:7

例如,我设置一个间隔,例如

timer = setInterval(fncName, 1000);

如果我去做了

clearInterval(timer);

它确实清除了间隔,但是有没有办法检查它是否清除了间隔?我尝试过在它有间隔时和没有间隔时获取它的值,但它们似乎都是数字。

javascript
7个回答
140
投票

没有直接的方法可以做你正在寻找的事情。相反,您可以在每次调用

timer
时将
clearInterval
设置为 false:

// Start timer
var timer = setInterval(fncName, 1000);

// End timer
clearInterval(timer);
timer = false;

现在,

timer
要么为假,要么在给定时间有一个值,所以你可以简单地检查

if (timer)
    ...

如果你想将其封装在一个类中:

function Interval(fn, time) {
    var timer = false;
    this.start = function () {
        if (!this.isRunning())
            timer = setInterval(fn, time);
    };
    this.stop = function () {
        clearInterval(timer);
        timer = false;
    };
    this.isRunning = function () {
        return timer !== false;
    };
}

var i = new Interval(fncName, 1000);
i.start();

if (i.isRunning())
    // ...

i.stop();

11
投票

setTimeout
setInterval
的返回值是完全不透明的值。你无法从它们中获得任何意义;它们的唯一用途是传回
clearTimeout
clearInterval

没有功能可以测试某个值是否对应于活动超时/间隔,抱歉!如果您想要一个可以检查其状态的计时器,您必须创建自己的包装函数来记住设置/清除状态是什么。


2
投票

我按照下面的方法做了,我的问题就解决了。当您清除计时器时,您应该将值设置为“false”。

var timeer=false;
----
----
if(timeer==false)
{
  starttimer();  
}
-----
-----
function starttimer()
{
  timeer_main=setInterval(activefunction, 1000);
  timeer=true;
}

function pausetimer()
{
  clearTimeout(timeer_main);
  timeer=false;
}

2
投票

你可以的

var interval = setInterval(function() {}, 1000);
interval = clearInterval(interval);
if (typeof interval === 'undefined'){
...
}

但是你实际上想做什么? clearInterval 函数是一个始终成功的函数,即使您使用 NaN 值调用它,它也始终返回 undefined,并且不会进行错误检查。


1
投票

您可以重写 setInterval 方法并添加跟踪间隔的功能。这是一个未经测试的示例来概述这个想法。它仅适用于当前窗口(如果您有多个窗口,您可以在原型对象的帮助下更改它),并且仅当您在注册您关心跟踪的任何函数之前覆盖函数时,这才会起作用:

var oldSetInterval = window.setInterval;
var oldClearInterval = window.clearInterval;
window.setInterval = function(func, time)
{
  var id = oldSetInterval(func, time);
  window.intervals.push(id);
  return id;
}
window.intervals = [];
window.clearInterval = function(id)
{
  for(int i = 0; i < window.setInterval.intervals; ++i)
    if (window.setInterval.intervals[i] == id)
    {
      window.setInterval.intervals.splice(i, 1);
    }
  oldClearInterval(id);
}
window.isIntervalRegistered(id)
{
  for(int i = 0; i < window.setInterval.intervals; ++i)
    if (window.setInterval.intervals[i] == func)
      return true;
  return false;
}



var i = 0;
var refreshLoop = setInterval(function(){
    i++;
}, 250);

if (isIntervalRegistered(refrshLoop)) alert('still registered');
else alert('not registered');
clearInterval(refreshLoop);
if (isIntervalRegistered(refrshLoop)) alert('still registered');
else alert('not registered');

0
投票

此问题的解决方案:创建一个全局计数器,该计数器在 setInterval 执行的代码中递增。然后在调用 setInterval 之前,测试计数器是否仍在递增。如果是这样,您的 setInterval 仍然处于活动状态。如果没有,你就可以走了。


0
投票

javascript:(function(){var wn=窗口,w,h,o={},m,dc,b,c='ABCDEFGHIJKLM1234567890nopqrstuvwxyz',y=setInterval,z=clearInterval,t=1;function x() {dc=文档;b=dc.body;b.innerHTML='';bs=b.style;w=wn.innerWidth;h=wn.innerHeight;bs.backgroundColor='黑色';bs.overflow='隐藏';m=y(n,25);dc.addEventListener('keydown',function(e){if(e.keyCode==83){if(t)z(m);else m=y(n, 25);t=!t}},0)}函数g(i){返回dc.getElementById(i)}函数r(d,m){返回Math.floor(Math.random()*d)+m }函数a(i){var d=g(i),ds=d.style,t=parseInt(ds.top),k=o[i];if(t

© www.soinside.com 2019 - 2024. All rights reserved.