2013-08-23 2 views
5

В настоящее время я использую инструмент для извлечения адресов в базе данных при нажатии на событие jQuery. Когда текстовый ввод теряет фокус, я отменяю все ожидающие запросы, чтобы избежать выпадающего списка, после того, как пользователь закончил заполнять вход. Все работает правильно, но, чтобы закончить, я отправлю окончательный запрос ajax, чтобы перейти к следующему шагу моей формы. Этот запрос действительно намного медленнее, чем до того, как я отменил все эти запросы. Я не понимаю, почему отмененный запрос не должен влиять на ожидающий (и я уверен, что они отменены, глядя на вкладку сети в хром-инструментах). Я использую этот код:jQuery запрос ajax отменен, замедляет текущий запрос

jQuery.xhrPool = []; 
jQuery.xhrPool.abortAll = function() { 
    jQuery(this).each(function(idx, jqXHR) { 
     jqXHR.abort(); 
     jQuery('.loader').hide(); 
    }); 
}; 

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

jQuery('#my_input').blur(function(){ 
    jQuery.xhrPool.abortAll(); 
}); 

Я предполагаю, что я оптимизация трюк я не получаю. Спасибо за помощь.

+0

Если вы не отменили их, это еще есть задержка? –

+0

Это гораздо медленнее, чем когда я их отменяю. – M4nch4k

+0

И что, если вы отправили этот запрос, не отправив ни одно из предыдущих, которое вы отменяете в первую очередь? Я подозреваю, что отмененные запросы не имеют никакого отношения к тому, как долго у вас возникают проблемы. –

ответ

3

Помните также, что открытие запроса AJAX на сервер, а затем отменить запрос не отменит запрос от обработки на сервере, он просто останавливает браузер от прослушивания ответа. Сервер будет продолжать обрабатывать любые отключенные запросы ajax до тех пор, пока они не закончатся, и в этот момент он пытается отправить ответ клиенту и не найти никого, кто слушает, умирает.

+1

Это замечательный момент, и будет иметь место, если серверный язык обрабатывает сеансы, похожие на то, как работает php. –

+0

Также забыл упомянуть, что ограничения на запросы AJAX браузером могут означать, что если вы сделаете четыре запроса, а окончательный запрос будет пятым, в зависимости от ограничений браузера пятый запрос будет висеть до тех пор, пока один из четырех остальных не завершится. – Mark

0
jQuery('#my_input').focusout(function(){ 
    jQuery.xhrPool.abortAll(); 
});  

размытость событие в том, что он поддерживает обнаружение потери фокуса от родительских элементов

blur vs focusout -- any real differences?

Смежные вопросы