2010-12-11 3 views
0

Je fais une notification en temps réel pour les mises à jour de nouveaux messages en utilisant jquery ajax. Les mises à jour des messages seront demandées lorsque l'utilisateur ouvrira la page dans laquelle le code javascript utilise window.onload. Une fois la requête terminée, une nouvelle demande sera créée. Le problème est que, lorsque l'utilisateur actualise la page ou ouvre une autre page, il va exécuter une nouvelle requête ajax pour les mises à jour des messages. Après quelques rafraîchissements, la page devient lourde et lente en raison de nombreuses requêtes ajax qui ne sont pas encore terminées. Alors, comment fermer la requête ajax précédente pour qu'il n'y ait qu'une requête à la fois?Surcharge Ajax Demande

Merci! Ci-dessous est juste un exemple de code pour vous aider à comprendre ce que j'ai demandé à propos de.

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

En 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; 
?> 

Répondre

0

Vous ne pouvez pas annuler de manière fiable les demandes ajax. IE par exemple gardera la demande en cours même si vous appelez .abort(); sur votre objet XHR. Le mieux que vous puissiez faire est d'assigner un ID croissant à chaque requête, puis d'ignorer les réponses des demandes avec un ID qui n'est pas celui de la requête la plus récente.

Sur un noeud de côté:

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

est un moyen terrible de compter les lignes. Utilisez ceci:

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