81

簡単に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);
4

4 に答える 4

166

単純にする。匿名関数の代わりに名前付き関数を使用できます。それを呼び出して、間隔を設定します。

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);
于 2012-05-12T11:37:03.500 に答える
24

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

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

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

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

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

于 2012-05-12T11:38:21.797 に答える
21

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

function startInterval(seconds, callback) {
  callback();
  return setInterval(callback, seconds * 1000);
}
于 2013-12-20T14:38:35.357 に答える
3

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

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

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

var myFnc = function() {
    // Do something every 9 seconds
    setTimeout(myFnc, 9000);
};
myFnc();
于 2012-05-12T11:38:49.110 に答える