Как остановить текущее AJAX-соединение и начать новое? - PullRequest
0 голосов
/ 27 марта 2011

У меня есть окно чата, которое будет загружать новые сообщения, используя ajax, на моей странице контента, и каждые 20 с будет прослушивать новые сообщения. Это работает. Тем не менее, прямо сейчас у меня есть еще одна ссылка, которая позволит пользователю загружать предыдущие сообщения. И эта кнопка, кажется, не работает, хотя я уже сделал clearTimeout () для существующей функции AJAX. есть идеи почему?

Мои сценарии:

   //for loading previous messages

    var timer;       

    $('#getoldmessages').click(function() {

        $("#workroom_boxes_chatpast").html('<img src="{{ MEDIA_URL }}images/ui-anim_basic_16x16.gif"/>&nbsp; Loading...');
        $.ajax({
            url: "/messages/{{ chat.key.id }}",
            cache: false,
            success: function(html){
                $("#chatcontent").html(html);
                $("#workroom_boxes_chatpast").html('Loaded');
            }
        });
                    clearTimeout(timer);

});      



   //for new messages

function updateMsg() {
$.ajax({
url: "/recent/messages/{{ chat.key.id }}",
cache: false,
success: function(html){
$("#chatcontent").html(html);
}
});
//alert('repeating');
t = setTimeout(updateMsg, 20000);
}
updateMsg();

1 Ответ

1 голос
/ 27 марта 2011

setTimeout(this, 20000); не работает, this относится к объекту jquery в этом контексте, а не к функции. Проверьте консоль javascript, и вы увидите ошибку.

Вам не нужно clearTimeout делать отдельный вызов ajax. Более того, ваш вызов может не работать, потому что вы ссылаетесь на переменную timer, которая имеет идентификатор тайм-аута от first вызова до setTimeout, но любой последующий вызов вернет новый идентификатор. Поэтому вам нужно добавить в updateMsg присваивание переменной: timer = setTimeout(updateMsg,20000);.

Если ваш исходный код выполняется в блоке $(), отдельном от updateMsg, таймер будет виден только в этом блоке, и изменение этого значения в updateMsg не будет иметь эффекта, что является другой проблемой. Если это так, либо сделайте timer глобальным, либо присоедините его к глобальному объекту, либо поместите updateMsg в этот блок $().

Наконец, вы все равно должны использовать setInterval вместо того, чтобы каждый раз вспоминать setTimeout, для этого он и создан.

...