SetTimeout, setInterval
3640 ワード
ブラウザ環境では、実際の待ち時間は0ではありません.
ブラウザは、HTML 5標準に規定されたオーバーラップタイマ実行間隔の制限を遵守する.この基準では、「5番目のオーバーラップタイマの後、待機時間は少なくとも4ミリ秒以上に制限する必要があります.」このような制限が明示されている.
これらの制限については、例を参照してください.例の
この制限は、
これは以前から存在していた制約ですが、古いスクリプトの中にはこの制約に依存しているものもあるため、リストを変更することはできません.
一方,サーバ側にはこのような制限はない.Node.jsのprocess.nextTickおよびsetImmediateを用いて、非同期動作を遅延なく実行することができる.上記の制限はブラウザのみです.
ご存知のように、DOM変更を画面に表示するには、時間の長さにかかわらず、ブラウザが現在の作業タスクを完了する必要があります.
ブラウザは、HTML 5標準に規定されたオーバーラップタイマ実行間隔の制限を遵守する.この基準では、「5番目のオーバーラップタイマの後、待機時間は少なくとも4ミリ秒以上に制限する必要があります.」このような制限が明示されている.
これらの制限については、例を参照してください.例の
setTimeout
は、関数runを遅延なく再呼び出すようにスケジューリングされる.アレイtimes
には、実際の遅延間隔に関する情報が記録されており、アレイ時間にどのような値が格納されているかを見てみましょう.let start = Date.now();
let times = [];
setTimeout(function run() {
times.push(Date.now() - start); // 이전 호출이 끝난 시점과 현재 호출이 시작된 시점의 시차를 기록
if (start + 100 < Date.now()) alert(times); // 지연 간격이 100ms를 넘어가면, array를 얼럿창에 띄워줌
else setTimeout(run); // 지연 간격이 100ms를 넘어가지 않으면 재스케줄링함
});
// 출력창 예시:
// 1,1,1,1,9,15,20,24,30,35,40,45,50,55,59,64,70,75,80,85,90,95,100
前のタイマーはspecに書いてあるように、直接運転を遅らせることはありません.しかし、5番目のオーバーラップタイマの後、遅延間隔は4ミリ秒を超え、9, 15, 20, 24...
と同じ値が格納されていることがわかる.この制限は、
setTimeout
だけでなく、setInterval
にも適用される.setInterval(f)
度の前回の関数f
は、遅延なしで動作したが、その後、遅延間隔を4ミリ秒以上に増やした.これは以前から存在していた制約ですが、古いスクリプトの中にはこの制約に依存しているものもあるため、リストを変更することはできません.
一方,サーバ側にはこのような制限はない.Node.jsのprocess.nextTickおよびsetImmediateを用いて、非同期動作を遅延なく実行することができる.上記の制限はブラウザのみです.
ご存知のように、DOM変更を画面に表示するには、時間の長さにかかわらず、ブラウザが現在の作業タスクを完了する必要があります.
Reference
この問題について(SetTimeout, setInterval), 我々は、より多くの情報をここで見つけました https://velog.io/@hqillz/SetTimeout-setIntervalテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol