web-dev-qa-db-ja.com

setIntervalループをすぐに開始する方法は?

単純なsetInterval

setInterval(function() {
      // Do something every 9 seconds
}, 9000);

最初のアクションは9秒後に発生します(t=9s)。ループに最初のアクションをすぐに実行させる(t=0)?

setIntervalのメカニズムがDelay - Action - Delay - Action ...ループ;の代わりに Action - Delay - Action - Delay ...ループ。

編集:私の機能は確かにループです

setInterval(function(){
$('.test').each(function(idx){
    var duration = 1000;
    $(this).delay(duration*idx);
    Some stuff here
});
}, 4000);
48
Googlebot

複雑にしないでおく。無名関数の代わりに名前付き関数を使用できます。それを呼び出して、間隔を設定します。

function doSomething() {
    console.log("tick");
}
doSomething();
setInterval(doSomething, 9000);

必要に応じてスコープを作成します。

(function() {
    function doSomething() {
        console.log("tick");
    }
    doSomething();
    setInterval(doSomething, 9000);
})();

最後に、以下はxを作成または影響することなく機能します。

setInterval(function x() {
    console.log("tick");
    return x;
}(), 9000);
112
Salman A

時々私はこのパターンを使用します...

(function me() {
    // Do something every 9 seconds

    setTimeout(me, 9000);
})();

何かを行うが実行されるまで待機してから、再度呼び出すまで約9秒待機するため、まったく同じではありません。しかし、これは多くの場合便利ですので、イベントキューのイベントが不必要にスタックすることはありません(ただし、実行に9秒かかるコードはありません:)

古いIEでは、meが外部スコープにリークすることに注意してください。

18
alex

setInterval()は本当にい関数です。このサニタイズバージョンを使用します。この関数はすぐに関数を呼び出し、関数パラメーターの前に数秒かかるため、実際にインライン関数定義で呼び出すのは賢明です。

function startInterval(seconds, callback) {
  callback();
  return setInterval(callback, seconds * 1000);
}
17
Richard

名前付き関数を使用して呼び出し、間隔に割り当てます。

var myFnc = function() {
    // Do something every 9 seconds
};
setInterval(myFnc, 9000);
myFnc();

他のオプションは、代わりにsetTimeoutを使用することです。

var myFnc = function() {
    // Do something every 9 seconds
    setTimeout(myFnc, 9000);
};
myFnc();
2
epascarello