给定的setInterval(setTimeout)函数调用javascript

时间:2012-11-28 13:04:18

标签: javascript setinterval

我需要通过给定的延迟多次调用某些函数。我该怎么办 - 为timer定义变量并将其传递给调用函数,以便在某个时刻停止计时器或循环(n次)调用setTimeout一次(或另一种方法来延迟一次延迟时间)或其他。谢谢。

编辑修复语法错误

    var timerID = null;
    var n = 5;
    this.timerID = setInterval(function(){ 
              funcToInvoke(n,timerID){ 
                   if(invokeNumber == n){
                       clearInterval(timerID);
                       return;
                   }
                   else { do something}
               }
    },delay)

3 个答案:

答案 0 :(得分:3)

是的,这种方法很常见,比在循环中调用setTimeout更好(具有固定次数)。它比这更高效,也更灵活,因为间隔将动态停止(可能会检查未来的情况)。

但是,你的代码有点乱。修正:

// Assuming we a have
//  n
//  delay
//  funcToInvoke
// and execute in context of some object
var that = this,
    numberOfInvokes = 0;
this.timer = setInterval(function() {
     // "this" points to the global object
     if (numberOfInvokes == n)
          clearInterval(that.timer);
     else
          funcToInvoke(numberOfInvokes);
     numberOfInvokes++;
}, delay);

答案 1 :(得分:2)

您当前的方法存在语法问题,您不能拥有像this.timerID这样的函数参数。实际上,您应该删除整个funcToInvoke声明,并将ntimerID声明为局部变量,以便它们可用于闭包。像这样:

// Don't forget to define n here!
var n = 5;
// Change timerID to local var instead of property
var timerID = null;
timerID = setInterval(function(){ 
    if(invokeNumber == n){
        clearInterval(timerID);
        return;
    } else { 
        //do something
    }
    // You can setTimeout again anywhere in this function if needed
}, delay);

答案 2 :(得分:1)

如果你想要一个近似的延迟,setInterval可能没问题。如果你想要一个更精确的间隔,那么重复调用setTimeout会更好,因为你可以根据自上次调用以来的时间调整下一次调用的时间长度。

E.g。对于每秒钟滴答的时钟,你可以重复调用setTimeout,将滞后设置为刚好在下一整秒之后。