Как завершить все 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();
вот и все, теперь можно начинать все с нуля.
Конечно можно писать все первым способом, это просто. А можно делать все по уму, тогда поддерживать такой код станет намного проще, ведь никаких изменений в аш первоначальный код вносить не надо. Это и есть парадигма разделения кода, которую несет ООП и событийное программирование.
Комментарии