2011-09-14 3 views
19

私はsetInterval()関数を使用して20秒ごとに関数を呼び出しています。しかし、私が気づいたことの1つは、setInterval()が実際に関数を呼び出すのは初めてで、(setInterval()が呼び出されたときではなく)20秒であるということです。ここに私の現在の回避策です:JavaScript:setInterval()を今すぐ起動するには?

dothis(); 
var i = setInterval(dothis, 20000); 

は、この重複したコードを持たずにこれを達成する方法はありますか?

答えて

29

あなたの方法は通常の方法です。

これは何度も起動した場合は、あなたが最初のハンドラを実行して、間隔を設定しますユーティリティ関数を作ることができる:

function setIntervalAndExecute(fn, t) { 
    fn(); 
    return(setInterval(fn, t)); 
} 

その後は、あなたのコードでは、あなただけのこれを行うことができます

var i = setIntervalAndExecute(dothis, 20000); 
+0

お役立ち情報ありがとう! – Andrew

2

dothis関数の戻り値が他に必要ない場合は、それ自身を返すことができます。

これにより、同時に呼び出して渡すことができます。戻り値が無視されると、無害になります。

function dothis() { 
    // your code 
    return dothis; 
} 

var i = setInterval(dothis(), 20000); 

そうしないと、呼び出しを与えると、すべての機能に機能を返すようにFunction.prototypeを拡張できます。

DEMO:http://jsfiddle.net/ZXeUz/

Function.prototype.invoke_assign = function() { 
    var func = this, 
     args = arguments; 
    func.call.apply(func, arguments); 
    return function() { func.call.apply(func, args); }; 
}; 

setInterval(dothis.invoke_assign('thisArg', 1, 2, 3), 20000); 

// thisArg 1 2 3 
// thisArg 1 2 3 
// thisArg 1 2 3 
// ... 

これは実際に物事を少し高め。それは引数のセットを渡すことができます。最初の引数は呼び出す関数のの値を設定し、残りの引数は正規の引数として渡されます。

返される関数は別の関数でラップされるため、初期呼び出しとインターバル呼び出しの動作が同じになります。

10

匿名関数を作成してすぐに呼び出すことができます。ただし、setIntervalではなくsetTimeout関数を使用します。

(function doStuff() { 
    //Do Stuff Here 
    setTimeout(doStuff,20000); 
})(); 

これは関数を実行してから、20秒後に再度呼び出します。

希望する動作やパフォーマンスのために、setTimeoutをsetIntervalよりも使用する方がよいことに注意してください。主な違いは、setIntervalは、そのタイムアウトが起きるたびに機能します。最後の呼び出しが実行を終了した場合やエラーが発生した場合は、REGALLESSに関係なく呼び出されます。 setTimeoutを使用すると、タイマーがリセットされる前に関数がその実行を終了することが保証されます。多くのトレードオフはかなり明らかですが、アプリケーションを設計する際には留意することが重要です。

EDIT patrick dwがタイムアウトをキャンセルする必要があるとの懸念から、最善の解決策は、匿名関数を使用しないことであり、ちょうどはい、これはOPを避けるためにしようとしていたものと似ているが、それは関数を呼び出した後、コールする必要がなくなりん宣言

var timeout; 
function doStuff() { 
    //doStuff 
    timeout = setTimeout(doStuff,20000); 
} 
doStuff() 

後にそれを呼び出しますsetInterval関数を使用して、コード行を保存します。いつでも機能を停止して開始することができます。

//Stop it 
clearTimeout(timeout); 

//Start it 
doStuff(); 
+0

plus: 'setTimeout'は、エラーがある場合に繰り返し続行しないので、望ましいです。 – Hemlock

+0

+1これは外部から関数を呼び出す必要がない場合、これは良い解決策だと思います。 – user113716

+0

...あなたは現在の回答で1ビットの機能を失っていますが。 OPには、変数に割り当てられた 'setInterval'の戻り値がありました。これは、ある時点で間隔をキャンセルする必要があることを意味しています。振る舞いを複製するには、呼び出しを停止するように設定できるフラグの状態に応じて、 'setTimeout'を介して再帰呼び出しを行う必要があります。 – user113716

関連する問題