2013-10-08 15 views
46

Mam funkcję, która uruchamia wywołanie ajax na zmianę danych wejściowych.Przerwij poprzednią prośbę ajaxową na nową prośbę

Ale jest szansa, że ​​funkcja zostanie uruchomiona ponownie przed zakończeniem poprzedniego połączenia ajax.

Moje pytanie brzmi: jak przerwać poprzednie połączenie ajax przed rozpoczęciem nowego? Bez użycia zmiennej globalnej. (Patrz odpowiedź na podobne pytanie here)

jsfiddle mojego aktualnego kodu:

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> 
+0

Tutaj jest lepszym rozwiązaniem jest tutaj lepszym http rozwiązanie: //www.thecave.info/how-to-abort-a-previous-ajax-request-in-jquery/ – semira

Odpowiedz

60
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 
    } 
}); 
+7

nie powinny oba programy obsługi odpowiedzi ('success' i' error') ustawić 'currentRequest' z powrotem na' null'? – CoDEmanX

+0

OP zapytał "jak aborcji poprzedniego połączenia ajax". Ale tutaj przerywasz 'currentRequest', który jest nowszy. W związku z tym poprzednia zostanie wykonana, nowe żądanie zostanie przerwane. Dobrze? – Blauhirn

+5

ah, nie. 'beforeSend' jest wykonywany * przed * obiekt' jqXHR' jest przypisany do 'currentRequest'. W związku z tym poprzednie połączenie zostaje przerwane. - zawsze doceń dobrze skomentowane odpowiedzi – Blauhirn

8
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); 

zapisać w zmiennej, a następnie, przed wysłaniem raz drugi, sprawdzić jego readyState i nazywają abort() razie potrzeby

+3

To było łatwiejsze niż sobie wyobrażałem. Stworzyłem skrzypce tego działającego: http://jsfiddle.net/YzDBg/4/ dla każdego, kto jest zainteresowany. Dzięki. – CharliePrynn

+6

Czy możesz wyjaśnić to szczegółowo? – SSS

0

Spróbuj kod

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; 
    } 
}; 
Powiązane problemy