1

与えられた遅延を通して与えられた回数、いくつかの関数を呼び出す必要があります。どうすればよいですか-タイマーの変数を宣言し、それを呼び出し関数に渡して、タイマーを一時停止するか、ループ(n回)でsetTimeoutを1回(または遅延時間を1回保持する別のアプローチ)呼び出します。ありがとうございます。

構文エラーを修正するために編集

    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.timerIDfuncToInvoke実際、宣言全体を削除し、nローカルtimerID変数として宣言する必要があります。そうすれば、クロージャーで使用できるようになります。このような:

// 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を繰り返し呼び出す方が適切です。

たとえば、1秒ごとに刻々と変化する時計の場合、setTimeoutを繰り返し呼び出して、ラグを次の1秒の直後に設定できます。

于 2012-11-28T13:10:53.553 に答える