次のスニペットは、少なくとも1秒間持続するタイムアウトを設定します。
var currentTimeMillis = new Date().getTime();
// do stuff...
var sleepTime = 1000 - (new Date().getTime() - currentTimeMillis);
sleepTime
は負の数になる可能性があるため、次のようにsetTimeout
を呼び出しても安全ですか。
setTimeout(callback, sleepTime)
または、setTimeout
を呼び出す前に負の値を確認する必要がありますか?
[〜#〜] mdn [〜#〜] リファレンスによれば、仕様では最小タイムアウトが必要です。
これよりも短い値を指定した場合(HTML5仕様では4ミリ秒)、ブラウザは遅延を無視して最小値を使用します。
したがって、ネガティブは最小値よりも小さいため、問題ないはずです。
どうやら、これは常に当てはまるわけではありません(Web開発ではいつもそうではありません!)。 ( http://programming.aiham.net/tag/browser-compatibility/ )によれば:
SetTimeoutに負の時間を指定すると、コールバック関数が呼び出されるとは限りません。これは他のブラウザでも機能しますが、Internet Explorer(8以下)では、負の時間がゼロに変更されていることを確認する必要があります。
私はこれを自分でテストしていませんが、トーマスが言ったように、安全である方が良いでしょう。
申し訳ありませんが安全である方がいいです:
setTimeout(callback, Math.max(sleepTime, 0))
次のように条件ステートメントを使用することもできます。
if (sleepTime < 0) {
sleepTime = 0;
}
setTimeout(callback, sleepTime);
ここでそれがどのように機能するかを確認できます:
うーん...前述の解決策は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)