2010-07-22 2 views
6

Есть ли простой способ отказаться от всех выдающихся запросов JQuery AJAX? Мое приложение способно снимать много одновременных запросов, поэтому гонка становится проблематичной. Я включил хакерские решения (а именно, добавив флаг, который проверяется при завершении запроса), но было бы гораздо лучше получить глобальную остановку всех функций выдающихся запросов.jQuery отказаться от всех выдающихся запросов AJAX

ответ

11

Присвоить каждый запрос Ajax в качестве элемента массива:

var requests = []; 

requests.push($.ajax({ 
    type: 'POST', 
    url: '...', 
    success: successfunc 
    }); 
); 

И убить:

$.each(requests, function(i, v) { 
    v.abort(); 
}); 
+0

Спасибо. Кажется, это трюк. Я выбрал несколько другую реализацию, которая подробно описана здесь (http://stackoverflow.com/questions/3313059/jquery-abandon-all-outstanding-ajax-requests/3313954#3313954) –

1

Я бы сказал, хранить все запросы ajax в массиве. Когда вам нужно убить, просто проведите все значения в массиве и вызовите abort(). Когда запрос завершается или прерывается, просто выпадайте из массива.

2

Функция XMLHttpRequest имеет функцию abort(). $ .ajax позволяет вам получить доступ к объекту xhr. вести запись всех выдающихся xhr's и идти xhr.abort() для любого, что вы хотите прекратить.

3

, как другие говорили, использовать метод .abort(). Однако это ТОЛЬКО работает при вызовах в пределах одного домена. после того, как вы входите в межсайтовые вызовы (с jsonp), тогда метод .abort() делегируется null, поэтому обычно не срабатывает/работает.

стоит отметить, так как это вызвало у меня бесконечное время отладки много маленькая луна назад :)

Джима

+0

Прохладная информация, спасибо за это хедз-ап , – Anders

+0

anders - удовольствие ... (tho 'проверяет последний статус на IE, поскольку это было главным образом XMLHttpRequest в IE, что было проблемой при попытке сделать его агностиком браузера в моем случае). я, кажется, помню, что для прерывания «timeout» установлено значение 0 при вызовах на сайте. в любом случае .. :) –

3

на основе решения Кена Redler, я положил это в моей инициализации:

window.requests = [] 
$.ajaxSetup({ 
    beforeSend: function(xhr){ 
    var new_request_list = [xhr] 
    $.each(window.requests, function(k,v){ 
     if(v.readyState != 4) new_request_list.push(v) 
    }) 
    window.requests = new_request_list 
    } 
}) 

I поставьте фрагмент с new_request_list, чтобы не допустить переполнения глобальной переменной с завершенными объектами XHR.

+0

Я бы поместил функцию очистки в '. $ .ajaxSetup' или' xhr.onreadystatechange', но я обеспокоен тем, что это будет мешать тому, что jQuery делает сам по себе. Это решение работает нормально. –

1

Я нашел следующее на jsfiddle. Он в основном такой же, как и выше, за исключением того, что он удалит каждый запрос после его завершения. Вышеприведенные решения просто добавляют к массиву. Поэтому со временем это может стать огромным, если вы делаете много вызовов ajax. Вы вызываете $.xhrPool.abortAll();, когда хотите отменить все невыполненные запросы.

// $.xhrPool and $.ajaxSetup are the solution 
$.xhrPool = []; 
$.xhrPool.abortAll = function() { 
    $(this).each(function(idx, jqXHR) { 
     jqXHR.abort(); 
    }); 
    $.xhrPool = []; 
}; 

$.ajaxSetup({ 
    beforeSend: function(jqXHR) { 
     $.xhrPool.push(jqXHR); 
    }, 
    complete: function(jqXHR) { 
     var index = $.xhrPool.indexOf(jqXHR); 
     if (index > -1) { 
      $.xhrPool.splice(index, 1); 
     } 
    } 
}); 
Смежные вопросы