Прервать предыдущий запрос ajax на новый запрос
у меня есть функция, которая запускает вызов ajax при изменении входных данных.
но есть вероятность, что функция будет запущена снова до завершения предыдущего вызова ajax.
мой вопрос в том, как бы я прервал предыдущий вызов ajax перед началом нового?
Без использования глобальной переменной. (См. ответ на аналогичный вопрос здесь)
jsfiddle мой текущий код:
Javascript:
var filterCandidates = function(form){
//Previous request needs to be aborted.
var request = $.ajax({
type: 'POST',
url: '/echo/json/',
data: {
json: JSON.stringify({
count: 1
})
},
success: function(data){
if(typeof data !== 'undefined'){
jQuery('.count').text(data.count)
console.log(data.count);
}
}
});
};
if(jQuery('#search').length > 0){
var form = jQuery('#search');
jQuery(form).find(':input').change(function() {
filterCandidates(form);
});
filterCandidates(form);
}
HTML:
<form id="search" name="search">
<input name="test" type="text" />
<input name="testtwo" type="text" />
</form>
<span class="count"></span>
4 ответов:
var currentRequest = null; currentRequest = jQuery.ajax({ type: 'POST', data: 'value=' + text, url: 'AJAX_URL', beforeSend : function() { if(currentRequest != null) { currentRequest.abort(); } }, success: function(data) { // Success }, error:function(e){ // Error } });
var filterCandidates = function(form){ //Previous request needs to be aborted. var request = $.ajax({ type: 'POST', url: '/echo/json/', data: { json: JSON.stringify({ count: 1 }) }, success: function(data){ if(typeof data !== 'undefined'){ jQuery('.count').text(data.count) console.log(data.count); } } }); return request; }; var ajax = filterCandidates(form);сохранить в переменной, а затем, перед отправкой во второй раз, проверить его
readyStateи звонокabort()при необходимости
попробуйте этот код
var lastCallFired=false; var filterCandidates = function(form){ if(!lastCallFired){ var request = $.ajax({ type: 'POST', url: '/echo/json/', data: { json: JSON.stringify({ count: 1 }) }, success: function(data){ if(typeof data !== 'undefined'){ jQuery('.count').text(data.count) console.log(data.count); } } }); setInterval(checkStatus, 20); } }; if(jQuery('#search').length > 0){ var form = jQuery('#search'); jQuery(form).find(':input').change(function() { filterCandidates(form); }); filterCandidates(form); } var checkStatus = function(){ if(request && request.readyState != 4){ request.abort(); } else{ lastCallFired=true; } };
вариант принятого ответа и принятый из комментария к вопросу-это отлично сработало для моего приложения....
используя $jQuery.пост.)(...
var request = null; function myAjaxFunction(){ $.ajaxSetup({cache: false}); // assures the cache is empty if (request != null) { request.abort(); request = null; } request = $.post('myAjaxURL', myForm.serialize(), function (data) { // do stuff here with the returned data.... console.log("returned data is ", data); }); }вызовите myAjaxFunction () столько раз, сколько вам нравится, и он убивает все, кроме последнего (у моего приложения есть "селектор даты" на нем и меняет цену в зависимости от выбранных дней - когда кто-то нажимает на них быстро без вышеуказанного кода, это бросок монеты, если они получат правильную цену или нет). не. С его 100% правильно!)
Comments