Перегрузка Ajax Request - PullRequest
       1

Перегрузка Ajax Request

0 голосов
/ 11 декабря 2010

Я делаю уведомления в режиме реального времени о новых сообщениях обновлений, используя jquery ajax.Обновления сообщения будут запрошены, когда пользователь откроет страницу, код JavaScript которой использует window.onload.После завершения запроса он создаст еще один новый запрос.Проблема в том, что когда пользователь обновляет страницу или открывает другую страницу, он выполняет новый запрос 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;
?>

1 Ответ

0 голосов
/ 11 декабря 2010

Вы не можете надежно отменить запросы AJAX. Например, IE будет продолжать выполнение запроса, даже если вы вызовете .abort(); для вашего объекта XHR.

Лучшее, что вы можете сделать - назначить каждому запросу увеличивающийся идентификатор, а затем игнорировать любые ответы на запросы с идентификатором, который не является одним из самых последних запросов.

На боковом узле:

$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);
...