2009-07-20 7 views
3

私は各ブラウザのすべてのjavascript実装の詳細にあまり慣れていません。しかし、setTimeoutを使用すると、渡されたメソッドが別のスレッドで呼び出されることがわかります。だからメソッドの内部で再帰的にsetTimeoutを使用すると、Stack Overflowが発生するまでスタックが無期限に拡張されますか?または、別の呼び出しスタックを作成し、フォーカスが外れた後に現在のフレームを破棄しますか?ここに私が思っているコードがあります。Javascript Pollサーバー。これはスタックのオーバーフローを引き起こしますか?

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

window.setTimeout(pollServer, 0); 

私は、毎秒かそこらのサーバーをポーリングしたいが、「ループ・ブロッキング」でCPUサイクルを無駄にしたくない - また、私は、ユーザーがアクセスすることができますどのくらいにいるtimelimitを設定する必要はありませんページがブラウザが消える前に放火犯を使用して

EDIT

、私はいくつかのブレークポイントを設定し、「スクリプト - >スタック」表示することによって、パネルをコールスタックは文字通り「pollServer」であり、それは呼び出しごとに成長しないことがわかりました。これは良いことですが、JSの他の実装は異なった動作をしますか?

答えて

2

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

これはprototypePeriodicalExecuterを実装する方法です。

// 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; 
     } 
    } 
    } 
}); 
+0

これは私の実装と非常によく似ています。これがSOを引き起こさないことが保証されているなら、それは私のコードではないようです。 – nlaq

+0

大きな違いは、あなたの懸念の原因である 'setTimeout'とは対照的に、' setInterval'を使用していることです。私があなたのところにいたら、 'setInterval'のために行き、自分自身を頭痛から救います。 –

+1

プロトタイプのPeriodicalExecutorのjQueryバージョンはありますか? –

0

setTimeoutは直ちに戻りますので、コールスタックは増加しません。あなたのコードがどのブラウザでも無期限に実行されるかどうかはわかりませんが、おそらくそうです。

1

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

これを停止して考えると、コールスタックがタイムアウト機能によって共有されるという有用な目的やエビデンスがあります。

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

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

0

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

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

次の機能が用意されています

  • 停止()は - 更新を停止します。
  • restart() - 一時停止後に更新を開始し、時間間隔をminTimeoutにリセットします。
  • continue() - 時間間隔をリセットせずに一時停止後に更新を開始する。
  • ステータス属性 - 現在のステータスが表示されます(実行している|停止|未定義)
  • アップデートのみ新しいデータ場合は、古いものと異なっています。
  • は、データが変更されない度に時間間隔を掛けます。
  • "maxFailedRequests"の後にデータを要求するのをやめて、ajax障害を処理します。
関連する問題