web-dev-qa-db-ja.com

負の遅延でsetTimeoutを呼び出しても大丈夫ですか?

次のスニペットは、少なくとも1秒間持続するタイムアウトを設定します。

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

sleepTimeは負の数になる可能性があるため、次のようにsetTimeoutを呼び出しても安全ですか。

setTimeout(callback, sleepTime)

または、setTimeoutを呼び出す前に負の値を確認する必要がありますか?

41
ripper234

[〜#〜] mdn [〜#〜] リファレンスによれば、仕様では最小タイムアウトが必要です。

これよりも短い値を指定した場合(HTML5仕様では4ミリ秒)、ブラウザは遅延を無視して最小値を使用します。

したがって、ネガティブは最小値よりも小さいため、問題ないはずです。


どうやら、これは常に当てはまるわけではありません(Web開発ではいつもそうではありません!)。 ( http://programming.aiham.net/tag/browser-compatibility/ )によれば:

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

私はこれを自分でテストしていませんが、トーマスが言ったように、安全である方が良いでしょう。

53

申し訳ありませんが安全である方がいいです:

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

次のように条件ステートメントを使用することもできます。

if (sleepTime < 0) {
  sleepTime = 0;
}
setTimeout(callback, sleepTime);
2
dku.rajkumar

ここでそれがどのように機能するかを確認できます:

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)
0
Peppe L-G