2010-12-11 142 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/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请求。例如,即使您在XHR对象上调用.abort();,IE仍会继续运行请求。

您可以做的最好的做法是为每个请求分配一个递增的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);