2010-12-11 16 views
0

jquery ajaxを使用して新しいメッセージの更新をリアルタイムで通知しています。 javascriptコードがwindow.onloadを使用しているページをユーザーが開くと、メッセージの更新が要求されます。要求が完了すると、別の新しい要求が作成されます。 問題は、ユーザーがページを更新するか、別のページを開くときに、メッセージ更新のための新しいajax要求を実行することです。 いくつかのリフレッシュページの後に、ページがまだ完了していない前に、多くのAjaxリクエストのためにページが重くなり、遅くなります。オーバーロードAjaxリクエスト

これで、以前のajaxリクエストを閉じて、一度にリクエストのみを行う方法はありますか?

ありがとうございます!

以下は、私が尋ねたことを理解するのに役立つコードの例です。アヤックスで

<script type="text/javascript" src="assets/js/jquery.js"></script> 
<script type="text/javascript"> 
function request_updates() { 
    var curr = $('#current_num').value(); 
    $.ajax({ 
     'url': 'ajax/ajax_message_update.php?curr='+curr, 
     'type': 'get', 
     'success': function(data) { 
      var message = 'You have '+data+' new messages!'; 
      $('#notification-box').html(message); 
      request_updates(); 
     } 
    }); 
} 
window.onload = request_updates; 
</script> 

/ajax_message_update.php

<?php 
// ajax/ajax_message_update.php 
$current_num = $_GET['curr']; 
$new_num = $current_num; 
while($current_num == $new_num) { 
    sleep(5); 
    $sql = "SELECT * FROM messages WHERE id=".user_id(); 
    $result = mysql_query($sql); 
    $new_num = mysql_num_rows($result); 
} 
echo $new_num; 
?> 

答えて

0

あなたは確実にAJAXリクエストをキャンセルすることはできません。たとえば、IEの場合、XHRオブジェクトに.abort();を呼び出しても要求は実行され続けます。

あなたができることは、すべてのリクエストにIDを増やして、最新のリクエストではないIDを持つリクエストからのレスポンスを無視することです。サイド・ノードで

$sql = "SELECT * FROM messages WHERE id=".user_id(); 
$result = mysql_query($sql); 
$new_num = mysql_num_rows($result); 

が行をカウントする恐ろしい方法です。これを使用:

$result = mysql_query('SELECT COUNT(*) FROM messages WHERE id=' . user_id()); 
$new_num = mysql_result($result, 0, 0);