2011-12-08 3 views
27

私は少なくとも1秒間は長続きしたいコードスニペットを持っています。だから私はそうする:負の遅延でsetTimeoutを呼び出していませんか?

var currentTimeMillis = new Date().getTime(); 
// do stuff 
var sleepTime = 1000 - (new Date().getTime() - currentTimeMillis); 

sleepTimeは負であってもよいことに注意してください。することができます

setTimeout(callback, sleepTime) 

明示的に負の値をチェックする必要がありますか?

答えて

34

MDN文献によれば、仕様は最小タイムアウトがあることが必要です。

これよりも少ないものを提供すると(HTML5仕様では4msと表示されます)、ブラウザは遅延を無視して最小値を使用します。

ネガは最小値よりも小さいので、ネガは問題ありません。


明らかに、これは必ずしもそうではありません(ウェブ開発では必ずしもそうではありません)。 (http://programming.aiham.net/tag/browser-compatibility/)によると:

負の時間をsetTimeoutを提供することは、常に呼び出されて コールバック関数にはなりません。これは他のブラウザでも機能しますが、 のInternet Explorer(8以下)では、負の値が0に変更されていることを確認する必要があります。

私はこれを自分でテストしていませんが、Thomasz氏のように、おそらく安全である方が良いでしょう。

+9

ネジIE8。あなたのためのタイムアウトはありません! –

31

良い後悔するより安全である:

setTimeout(callback, Math.max(sleepTime, 0)) 
+0

私は 'if(sleepTime> 0)setTimeout(...)else'を実行する必要があると思っています。これは少し醜いでしょう。 – ripper234

1
if(sleepTime < 0) 
sleepTime = 0; 

setTimeout(callback, sleepTime) ; 

でも同様にすることができます。

1

あなたはそれがここでどのように機能するかを確認することができます:それは呼び出しが行われるたびに書き込む必要があるので、

http://jsfiddle.net/ayezutov/2eZLe/8/

1

は、うーん...言及したソリューションは、setTimeoutへの呼び出しで問題を解決します。 setTimeoutで直接解決する方が良いですか?

// Run this once. 
(function(){ 
    var oldSetTimeout = setTimeout 
    setTimeout = function(callback, delay){ 
     return oldSetTimeout(callback, Math.max(delay, 0)) 
    } 
})() 

// Call setTimeout safely with a negative delay. 
setTimeout(function(){ console.log("Hello World") }, -42)