2012-12-06 92 views
5

Webアプリケーションが新しいデータをチェックできるように、バックグラウンドでjQueryを「ハートビート」としてAJAX呼び出しを行いたいとします。例えば、10秒ごと。setIntervalを使用したAjaxハートビート、同時に複数の呼び出しを防止する

他の投稿では、setInterval()を使用して、Xミリ秒ごとに呼び出しを行うメソッドを呼び出すことができます。

ただし、AJAXコールに10秒以上かかるとどうなりますか?私はまだそれが最後の要求を完了したいと思うし、すでに進行中のコールがあるときに別のコールを扇動したくない。これにより、同じ情報がページに2回配置される可能性があります。

元のAJAX呼び出しが完了していない可能性がある場合は、単純に「10秒ごと」ではなく、元のAJAX呼び出しが完了するのを待つ方法を実装する方法は何ですか。

+0

互いに要求を完了するために待機します。既にASP .NETを使用している場合は、SignalRが理想的な組み合わせになる可能性があります。これはWebソケットを使用し、実行している環境によって自動的に他のテクノロジにフォールバックするためです。 Socket.IOは別のものです。 – Luke

答えて

8

があなたのAJAX成功関数から別のタイムアウトを設定してみてくださいだろう。

function poll() { 
    setTimeout(function() { 
     $.ajax(.......).success(function(data) { 
      poll(); //call your function again after successfully calling the first time. 
     }); 
    }, 10000); 
} 
+0

ありがとう、私はこれを実装するよ! – Luke

6

代わりのsetIntervalを使用して、10秒を終了前のものの後に、各通話を開始するためにAJAXの完了コールバックでsetTimeout()を呼び出します。

+0

すごく感謝、私はこれをしようとしている! – Luke

1

の代わりにsetIntervalを使用して、リクエスト時間(通常は秒単位のUNIXタイムスタンプを使用)を計算します。サーバー側では、どれくらい10秒かかりますか?setTimeoutを使用して、ユーザごとに異なります。自分のping時間(またはサイトの事業)(PHPのように)、サーバ側で

function heartbeat(){ 
    $.ajax({ 
    'url': '/where/', 
    'success': function(data){ 
     setTimeout(heartbeat, parseInt(data) * 1000); 
    } 
    }); 
} 
heartbeat(); // initialize it 

、あなたが

<?php 
// do your stuff 
echo (time() - (int)$time_requested) + 10; // it will vary per user, so if it takes 2 second, it will be 12, if it returns imediately, returns 10 
0

だけで非同期を使用します。「false」に

$.ajax({ 
    'url': '/where/', 
    'async': 'false', 
    'success': function(data){ 
     setTimeout(heartbeat, parseInt(data) * 1000); 
    } 
    }); 

にAJAXは、私はちょうどこれを実装するためのWebSocketを発見したこれを読んでいる人には

関連する問題