2012-05-12 7 views
36

シンプルsetIntervalすぐにsetIntervalループを開始するには?

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

の最初のアクションは、9秒(t=9s)の後に起こります。ループで最初のアクションをすぐに実行する方法(t=0)?

私はそれがsetIntervalのメカニズムのためだと思います。ループはDelay - Action - Delay - Action ...です。 Action - Delay - Action - Delay ...ループの代わりに。

EDIT: My機能

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

答えて

76

はそれをシンプルに保つよう、実際のループです。無名関数の代わりに名前付き関数を使うことができます。それを呼び出して間隔を設定します。

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); 
+0

ニース、シンプルなソリューション、ありがとう! –

+1

この答えの最初の部分は、ループごとに新しい 'setInterval'が作成されるにつれ、徐々に遅くなります。これは 'window.setInterval'を' setTimeout'に置き換えることで修正できます。 – spikespaz

17

...

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

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

全く同じではありません。何かを行うまで待つことになります。が実行されてから9秒間待ってからもう一度呼び出されます。しかし、これは便利なことが多いので、イベントキューのイベントは不必要に積み重ねられません(ただし、実行するのに9秒かかるコードはありません:)。

古いIEでは、meが外部スコープに漏れます。

+0

* "古いIEでは、私が外部のスコープに漏れてしまうことに注意してください。" *異なるコードで、異なる時間に2つの異なる関数が作成されます。あなたのコードが実行される*最初の時間、それはそれらの1つです。次のすべての時間はもう1つです。奇妙だが真実。 –

+0

これはすべてのブラウザでシームレスに動作します。それはちょうどきれいです。 IEのどのバージョンが誤動作していますか? – thekingoftruth

+0

@thekingoftruth IEでシームレスに* me *識別子をリークします。メモリから、<= IE8に問題があります。 – alex

2

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

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

これは名前付き関数ではなく、変数に割り当てられた無名関数です。*変数*には名前がありますが、機能はありません(デバッガ以外の機能呼び出しスタックなどで便利な名前を表示することはできません[最新のChrome Dev ToolsとFirebugは非常にスマートです])。 –

12

setInterval()は実際には醜い機能です。私はこの関数をすぐに呼び出して、関数パラメータの前にインライン関数定義でそれを呼び出すことは実際には分かりやすいように、数秒で時間をかけているこのサニタイズバージョンを使用します。

function startInterval(seconds, callback) { 
    callback(); 
    return setInterval(callback, seconds * 1000); 
} 
関連する問題