Os diferidos do jQuery podem ser cancelados?
Eu tenho uma situação onde eu quero cancelar um diferido. O diferido está associado a uma chamada ajax.
Por que estou usando deferredsEu não uso os objetos xhr normais retornados por $ .ajax. Estou usando jsonp, o que significa que não posso usar códigos de status HTTP para tratamento de erros e tenho que incorporá-los nas respostas. Os códigos são então examinados e um objeto adiado associado é marcado como resolvido ou rejeitado de acordo. Eu tenho uma função de API personalizada que faz isso por mim.
function api(options) {
var url = settings('api') + options.url;
var deferred = $.Deferred(function(){
this.done(options.success);
this.fail(options.error);
});
$.ajax({
'url': url,
'dataType':'jsonp',
'data': (options.noAuth == true) ? options.data : $.extend(true, getAPICredentials(), options.data)
}).success(function(jsonReturn){
// Success
if(hasStatus(jsonReturn, 'code', 200)) {
deferred.resolveWith(this, [jsonReturn]);
}
// Failure
else {
deferred.rejectWith(this, [jsonReturn]);
}
});
return deferred;
}
Por que eu quero cancelar o diferidoExiste um campo de entrada que serve como um filtro para uma lista e atualizará automaticamente a lista meio segundo após a digitação terminar. Como é possível que duas chamadas ajax sejam excelentes por vez, preciso cancelar a chamada anterior para garantir que ela não retorne após a segunda e mostre os dados antigos.
Soluções que não gostoEu não quero rejeitar o diferido porque isso vai demitir manipuladores ligados com.fail()
.Eu não posso ignorá-lo porque ele será automaticamente marcado como resolvido ou rejeitado quando o ajax retornar.A exclusão do adiado causará um erro quando a chamada ajax retornar e tentar marcar o adiado como resolvido ou rejeitado.O que devo fazer?Existe uma maneira de cancelar o diferido ou remover os manipuladores conectados?
Conselhos sobre como consertar meu design são bem-vindos, mas será dada preferência a encontrar uma maneira de remover manipuladores ou impedi-los de disparar.