Cuando tengo una devolución de llamada que pueda alimentarse varias veces, pero yo quiero usar sólo la última, que utilicen el siguiente procedimiento:
var resultsXHR, resultsTimer, resultsId=0;
$('input').keyup(function(){
clearTimeout(resultsTimer); // Remove any queued request
if (resultsXHR) resultsXHR.abort(); // Cancel request in progress
resultsTimer = setTimeout(function(){ // Record the queued request
var id = ++resultsId; // Record the calling order
resultsXHR = $.get('/results',function(data){ // Capture request in progress
resultsXHR = null; // This request is done
if (id!=resultsId) return; // A later request is pending
// ... actually do stuff here ...
});
},500); // Wait 500ms after keyup
});
El abort()
por sí sola no es suficiente para evitar la devolución de llamada de éxito de siendo invocado; aún puede encontrar la ejecución de devolución de llamada aunque haya intentado cancelar la solicitud. Es por esto que es necesario utilizar el rastreador resultsId
y hacer que su devolución de llamada se tramite si otra, más adelante, la retrollamada superpuesta está lista para funcionar.
Teniendo en cuenta lo común y engorroso que es esto, creo que es una buena idea envolverlo de una manera reutilizable que no requiera la creación de un triplete único de nombres de variables locales para cada uno que desee Mango:
(function($){
$.fn.bindDelayedGet = function(event,delay,url,dataCallback,dataType,callback){
var xhr, timer, ct=0;
return this.bind(event,function(){
clearTimeout(timer);
if (xhr) xhr.abort();
timer = setTimeout(function(){
var id = ++ct;
xhr = $.get(url,dataCallback && dataCallback(),function(data){
xhr = null;
if (id==ct) callback(data);
},dataType);
},delay);
});
};
})(jQuery);
// In action
var inp = $('#myinput').bindDelayedGet('keyup',400,'/search',
function(){ return {term:inp.val()}; },
'html',
function(html){ $('#searchResults').clear().append(html); }
);
puede encontrar el código anterior se discute en más detalle on my website.
No es algo que haya intentado, pero el método get() devuelve la subyacente XMLHttpRequest, que puede ser abort() ed. ¿Eso ayudaría? – Andy
posible duplicado de [Cancelación de jquery de solicitud de Ajax anterior] (http: // stackoverflow.com/questions/4342438/canceling-previous-ajax-request-jquery) – Phrogz