JSにおけるsetTimeoutとsetIntervalの最大遅延値について詳細に説明する.

1990 ワード

前言
JavaScriptはタイミング実行コードの機能を提供しています.タイマーといいます.主にsetTimeout()setInterval()の2つの関数によって完成されます.この文章では主にJSのsetTimeoutとset Intervalの最大遅延値について紹介しています.必要な友達は次のように勉強しましょう.
まずこのようなコードを見てください.

function update() {
 loadData().then(function(data) {
  $('#content').html(data.content);
  var delay = data.nextUpdateTime - new Date();
  if (delay > 0) {
   setTimeout(update, delay);
  }
 });
}
その流れはとても簡単です.AJAXでデータをロードしてHTMLの内容を更新します.次回の更新時間が指定されている場合は、タイマによってその時点でもう一度全体の流れを実行します.
このコードに何か隠れた危険があるとしたら、data.nextUpdateTimeは現在の時間差(すなわちdelay変数の値)と比較して小さい時に、内容が頻繁に更新されるということです.しかし、これは正常な業務ロジックです.最適化するには、コンテンツ更新の即時性を犠牲にするしかないです.しかし、ここで私が言いたいのは、時間差が非常に大きい時にも同じ問題が発生します.
この場面をシミュレートします.

function log() {
 console.log('executed');
}

var nextUpdateTime = new Date();
//       
nextUpdateTime.setMonth(nextUpdateTime.getMonth() + 1);

var delay = nextUpdateTime - new Date();
setTimeout(log, delay);
このコードの本来の意味はlog関数を一ヶ月後に実行させることですが、実行するとすぐに実行されます.どうしてですか?
関連した内容を検索すると、setTimeoutはInt 32を使用して遅延パラメータ値を格納するものであり、つまり最大の遅延値は2^31-1である.最大値を超えると、その効果は延長値が0の場合と同じで、すぐに実行されます.
この最大の遅延値はもう一ヶ月近くになりました.一般的にユーザーも長い間ウェブページを開いていません.もし本当にこんなに長く開いたら、更新してください.

function update() {
 loadData().then(function(data) {
  $('#content').html(data.content);
  var delay = data.nextUpdateTime - new Date();
  if (delay > 0) {
   //           
   var ONE_DAY = 24 * 60 * 60 * 1000;
   if (delay > ONE_DAY) {
    setTimeout(function() {
     window.location.reload();
    }, ONE_DAY);
   } else {
    setTimeout(update, delay);
   }
  }
 });
}
同じ問題はset Intervalにも存在する.これもJavascriptの中の比較的に隠れた穴です.
締め括りをつける
以上はこの文章の全部の内容です.本文の内容は皆さんの学習や仕事に一定の助けをもたらしてほしいです.もし疑問があれば、メッセージを残して交流してもいいです.