Как щавергить все ajax запросы к серверуКак завершить все ajax запросы на jquery. Вы я верен знаете, что все события в JavaScript происходят последовательно. То, что называется асинхронным ajax запросом, на самом деле ем что иное, как цепь последовательных событий. И так случается, то если запросы происходят к одному серверу, что пока не завершится один запрос, другой будет висеть в воздухе. В связи с этим возникла необходимость, обрубать все текущие ajax запросы, при инициализации нового. Как это сделать? 

Как это работает при обычном запросе.

var xhr 	= $.get('index.php'), // первый запрос
	xhr2 	= $.get('index2.php'); // второй запрос
xhr.abort();// рубим его
xhr2.abort();// рубим его
xhr = $.get('dsds.php'); // третий запрос

Но, что если у Вас нет возможности запоминать все запросы в переменную, а обрубить надо их все.

На помощь придет сама jQuery. Дело в том, что при каждом ajax запросе,  jQuery вызывает ряд обработчиков.

jQuery.ajaxStart() - при отправке любого запроса
jQuery.ajaxSuccess() - при благополучном завершении любого запроса 
jQuery.ajaxError() - при не благополучном завершении любого запроса 
jQuery.ajaxComplete() - при завершении любого запроса 

Повесить обработчик на событие можно, точно также, как и на любые другие  

jQuery.ajaxStart(function(){
 alert('ajax запрос начат')
})

Воспользуемся этим, и при каждом запросе. будем запоминать его xhr

$.xhrPool = [];
$.xhrPool.abortAll = function() {
    $(this).each(function(idx, jqXHR) {
        jqXHR.abort();
    });
    $.xhrPool.length = 0
};

$.ajaxSetup({
    beforeSend: function(jqXHR) {
        $.xhrPool.push(jqXHR);
    },
    complete: function(jqXHR) {
        var index = $.xhrPool.indexOf(jqXHR);
        if (index > -1) {
            $.xhrPool.splice(index, 1);
        }
    }
});

В детали вдаваться не стану. Суть думаю ясна. Все запросы складируются в массив  $.xhrPool, и чтобы завершить все текущие запросы, просто нужно вызвать метод  

$.xhrPool.abortAll();

вот и все, теперь можно начинать все с нуля. 

Конечно можно писать все первым способом, это просто. А можно делать все по уму, тогда поддерживать такой код станет намного проще, ведь никаких изменений в аш первоначальный код вносить не надо. Это и есть парадигма разделения кода, которую несет ООП и событийное программирование.

Оставлять комментарии могут только зарегистрированные пользователи

Комментарии  

murzer
# murzer 20.06.2013 14:55
Query..ajaxComplete()
j - очепятка )))
Leroy
# Leroy 20.06.2013 22:45
спасибо