1

我需要通过给定的延迟调用一些给定次数的函数。我应该怎么做 - 为定时器声明变量并将其传递给调用函数以在某个时刻或循环中停止定时器(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)
4

3 回答 3

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);
于 2012-11-28T13:23:52.423 回答
2

您当前的方法有语法问题,您不能有像this.timerID) 这样的函数参数。实际上,您应该删除整个funcToInvoke声明,并将 and 声明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);
于 2012-11-28T13:19:26.673 回答
1

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

例如,对于每秒滴答的时钟,您可以重复调用 setTimeout,将延迟设置为下一整秒之后。

于 2012-11-28T13:10:53.553 回答