3

私は、各ブラウザのすべての JavaScript 実装の詳細にあまり精通していません。ただし、setTimeout を使用すると、渡されたメソッドが別のスレッドで呼び出されることはわかっています。では、メソッド内で setTimeout を再帰的に使用すると、スタック オーバーフローが発生するまでそのスタックが無期限に拡大するのでしょうか? それとも、別のコールスタックを作成し、フォーカスが外れたら現在のフレームを破棄しますか? 気になるコーデはこちら。

function pollServer()
{
    $.getJSON("poll.php", {}, function(data){
        window.setTimeout(pollServer, 1000);
    });
}

window.setTimeout(pollServer, 0);

サーバーを毎秒ポーリングしたいのですが、「ブロッキング ループ」で CPU サイクルを浪費したくありません。また、ユーザーがページにアクセスできる時間制限を設定したくありません。

編集

firebug を使用していくつかのブレークポイントを設定し、[スクリプト -> スタック] パネルを表示すると、コール スタックが文字通り単なる「pollServer」であり、コールごとに増加しないことがわかりました。これは良いことですが、JS の他の実装は異なる動作をしますか?

4

4 に答える 4

2

setIntervalスタック オーバーフローが発生するかどうかはわかりませんが、期間が一定の場合は使用することをお勧めします。

これは、プロトタイプがその を実装する方法PeriodicalExecuterです。

// Taken from Prototype (www.prototypejs.org)
var PeriodicalExecuter = Class.create({
  initialize: function(callback, frequency) {
    this.callback = callback;
    this.frequency = frequency;
    this.currentlyExecuting = false;

    this.registerCallback();
  },

  registerCallback: function() {
    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  execute: function() {
    this.callback(this);
  },

  stop: function() {
    if (!this.timer) return;
    clearInterval(this.timer);
    this.timer = null;
  },

  onTimerEvent: function() {
    if (!this.currentlyExecuting) {
      try {
        this.currentlyExecuting = true;
        this.execute();
      } finally {
        this.currentlyExecuting = false;
      }
    }
  }
});
于 2009-07-20T19:00:45.387 に答える
1

setTimeout は、後でイベント ポンプ ループで実行されます。setTimeout に渡される関数は継続ではありません。

立ち止まって考えてみると、コールスタックがタイムアウト関数によって共有されているという有用な目的または証拠は何ですか。

  • それらが共有されている場合、セッターからタイムアウト関数までどのスタックが共有されますか?
  • セッターがいくつかのリターンを実行し、いくつかのフレームをポップできる場合、何が渡されますか?
  • タイムアウト機能は元のスレッドをブロックしますか?
  • setTimeout 関数の後のステートメントは、タイムアウトの実行後に実行されますか?

これらの質問に答えると、回答者がNOであることが明らかになります。

于 2009-07-21T02:11:36.667 に答える
0

jQuery「SmartUpdater」プラグインを見てください。

http://plugins.jquery.com/project/smartupdater

次の機能を利用できます。

  • stop() - 更新を停止します。
  • restart() - 時間間隔を minTimeout にリセットして、一時停止後に更新を開始します。
  • continue() - 時間間隔をリセットせずに一時停止後に更新を開始します。
  • status 属性- 現在のステータスを表示します ( running | stopped | undefined )
  • 新しいデータが古いデータと異なる場合にのみ更新されます。
  • データが変更されないたびに時間間隔を乗算します。
  • 「maxFailedRequests」後にデータのリクエストを停止することで、ajax の失敗を処理します。
于 2010-07-05T10:44:49.087 に答える
0

setTimeout はすぐに戻るため、コールスタックを増やしません。あなたのコードがどのブラウザーでも無期限に実行されるかどうかはわかりませんが、可能性は高いようです。

于 2009-07-21T02:04:52.667 に答える