2010-12-11 9 views
0

Ich mache Echtzeitbenachrichtigung für neue Nachrichten Updates mit jquery ajax. Die Nachrichtenaktualisierungen werden angefordert, wenn Benutzer die Seite öffnen, die der JavaScript-Code window.onload verwendet. Nachdem die Anfrage abgeschlossen ist, wird eine weitere neue Anfrage erstellt. Das Problem ist, wenn Benutzer aktualisieren Seite oder öffnen Sie eine andere Seite, wird es neue Ajax-Anfrage für die Nachrichtenaktualisierungen ausführen. Nach einigen Refresh-Seiten wird die Seite schwer und langsam, da viele Ajax-Anfragen noch nicht abgeschlossen sind.Overload Ajax Request

Also, wie die vorherige Ajax-Anfrage zu schließen, so dass es nur eine Anfrage zu einer Zeit gibt?

Danke!

Im Folgenden finden Sie nur einen Beispielcode, der Ihnen hilft zu verstehen, worum ich gebeten habe.

<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> 

In ajax/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; 
?> 

Antwort

0

Sie können nicht zuverlässig Ajax-Anfragen abbrechen. IE zum Beispiel wird die Anfrage laufen lassen, selbst wenn Sie .abort(); auf Ihrem XHR-Objekt aufrufen.

Das Beste, was Sie tun können, ist, jeder Anfrage eine steigende ID zuzuweisen und dann alle Antworten von Anfragen mit einer ID zu ignorieren, die nicht die letzte der letzten Anfragen ist.

Auf einer Seite-Knoten:

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

ist eine schreckliche Art und Weise um die Zeilen zu zählen. Verwenden Sie diese:

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