A "nova" maneira de fazer isso desde jQuery 1.5 (janeiro de 2011) é usar objetos adiados em vez de passar um success
retorno de chamada. Você deve retornar o resultado de $.ajax
e, em seguida, usar os métodos .done
, .fail
etc para adicionar os retornos de$.ajax
chamada fora da chamada .
function getData() {
return $.ajax({
url : 'example.com',
type: 'GET'
});
}
function handleData(data /* , textStatus, jqXHR */ ) {
alert(data);
//do some stuff
}
getData().done(handleData);
Isso separa o tratamento de callback do tratamento AJAX, permite que você adicione múltiplos callbacks, callbacks de falha, etc, tudo sem nunca precisar modificar a getData()
função original . Separar a funcionalidade AJAX do conjunto de ações a serem concluídas posteriormente é uma coisa boa! .
Os adiados também permitem uma sincronização muito mais fácil de vários eventos assíncronos, que você não pode fazer facilmente apenas com success:
Por exemplo, eu poderia adicionar vários retornos de chamada, um gerenciador de erros e esperar que um cronômetro transcorra antes de continuar:
// a trivial timer, just for demo purposes -
// it resolves itself after 5 seconds
var timer = $.Deferred();
setTimeout(timer.resolve, 5000);
// add a done handler _and_ an `error:` handler, even though `getData`
// didn't directly expose that functionality
var ajax = getData().done(handleData).fail(error);
$.when(timer, ajax).done(function() {
// this won't be called until *both* the AJAX and the 5s timer have finished
});
ajax.done(function(data) {
// you can add additional callbacks too, even if the AJAX call
// already finished
});
Outras partes do jQuery também usam objetos adiados - você pode sincronizar animações do jQuery com outras operações assíncronas muito facilmente com eles.
deferred objects
coisa foi apresentada? Eu não vi isso antes. Além disso, parece um pouco confuso, já que o código que define qual retorno de chamada usar está em um local diferente do que a chamada AJAX real.