success
foi o nome tradicional do retorno de chamada bem-sucedido no jQuery, definido como uma opção na chamada ajax. No entanto, desde a implementação de $.Deferreds
retornos de chamada mais sofisticados, done
é a maneira preferida de implementar retornos de sucesso, como pode ser chamado em qualquer deferred
.
Por exemplo, sucesso:
$.ajax({
url: '/',
success: function(data) {}
});
Por exemplo, feito:
$.ajax({url: '/'}).done(function(data) {});
O ponto positivo done
é que o valor de retorno $.ajax
agora é uma promessa adiada que pode ser vinculada a qualquer outro lugar no seu aplicativo. Então, digamos que você queira fazer essa chamada ajax de alguns lugares diferentes. Ao invés de passar em sua função de sucesso como uma opção para a função que faz com que esta chamada ajax, você pode apenas ter a função de retorno $.ajax
em si e ligam seus retornos de chamada com done
, fail
, then
, ou o que quer. Observe que always
é um retorno de chamada que será executado se a solicitação for bem-sucedida ou falhar. done
só será acionado com sucesso.
Por exemplo:
function xhr_get(url) {
return $.ajax({
url: url,
type: 'get',
dataType: 'json',
beforeSend: showLoadingImgFn
})
.always(function() {
// remove loading image maybe
})
.fail(function() {
// handle request failures
});
}
xhr_get('/index').done(function(data) {
// do stuff with index data
});
xhr_get('/id').done(function(data) {
// do stuff with id data
});
Um benefício importante disso em termos de manutenção é que você envolveu seu mecanismo ajax em uma função específica do aplicativo. Se você decidir que sua $.ajax
chamada funcionará de maneira diferente no futuro, ou se usar um método ajax diferente ou se afastar do jQuery, precisará alterar apenas a xhr_get
definição (não se esqueça de retornar uma promessa ou pelo menos um done
método, em o caso do exemplo acima). Todas as outras referências em todo o aplicativo podem permanecer as mesmas.
Você pode fazer muito mais coisas (muito mais legais) $.Deferred
, uma das quais é usar pipe
para acionar uma falha em um erro relatado pelo servidor, mesmo quando a $.ajax
solicitação é bem-sucedida. Por exemplo:
function xhr_get(url) {
return $.ajax({
url: url,
type: 'get',
dataType: 'json'
})
.pipe(function(data) {
return data.responseCode != 200 ?
$.Deferred().reject( data ) :
data;
})
.fail(function(data) {
if ( data.responseCode )
console.log( data.responseCode );
});
}
xhr_get('/index').done(function(data) {
// will not run if json returned from ajax has responseCode other than 200
});
Leia mais $.Deferred
aqui: http://api.jquery.com/category/deferred-object/
NOTA : A partir do jQuery 1.8, pipe
foi preterido em favor do uso then
exatamente da mesma maneira.
success:
/.done()
são definidas, se é que existem. Por exemplo, ésuccess:
apenas implementado como o primeiro.done()
nos dias de hoje?success:
e.done
em uma chamada ajax? Boa pergunta. Como todos os outros retornos de chamada são chamados na ordem em que estão vinculados, meu palpite é que sim,success
é apenas chamado primeiro.pipe
é aquele em que a solicitação é bem-sucedida, mas o script no servidor não retornou o que você estava procurando. Você pode não querer lançar 404 ou 500 reais ou o que quer que seja no lado do servidor, porque deseja distinguir significativamente entre respostas http e respostas de aplicativos. Definir um código de resposta no JSON e, em seguida, usá-lopipe
dessa maneira permite lidar com diferentes tipos de erros com mais nuances.Se você precisar
async: false
no seu ajax, use emsuccess
vez de.done
. Caso contrário, é melhor você usar.done
. Isto é do site oficial do jQuery :fonte
async:false
?$.ajax({ url: req_url, ..., async: false, success: function (result, status, req) { }, error: function (jqXHR, status) { } });
Os objetos jqXHR retornados pelo
$.ajax()
jQuery 1.5 implementam a interface Promise, fornecendo a eles todas as propriedades, métodos e comportamento de uma Promise (consulte Objeto adiado para obter mais informações). Esses métodos usam um ou mais argumentos de função que são chamados quando a$.ajax()
solicitação termina. Isso permite atribuir vários retornos de chamada em uma única solicitação e até atribuir retornos de chamada após a conclusão da solicitação. (Se a solicitação já estiver concluída, o retorno de chamada será acionado imediatamente.) Os métodos Promise disponíveis do objeto jqXHR incluem:Uma construção alternativa à opção de retorno de chamada bem-sucedida, consulte os
deferred.done()
detalhes da implementação.Uma construção alternativa à opção de retorno de chamada de erro, o
.fail()
método substitui o método .error () descontinuado. Consulte deferred.fail () para obter detalhes da implementação.(adicionado no jQuery 1.6) Uma construção alternativa à opção de retorno de chamada completa, o
.always()
método substitui o.complete()
método obsoleto .Em resposta a uma solicitação bem-sucedida, os argumentos da função são os mesmos de
.done()
: data, textStatus e o objeto jqXHR. Para pedidos com falha, os argumentos são os mesmos de.fail()
: o objeto jqXHR, textStatus e errorThrown. Consulte osdeferred.always()
detalhes da implementação.Incorpora a funcionalidade dos métodos
.done()
e.fail()
, permitindo (a partir do jQuery 1.8) a promessa subjacente ser manipulada. Consulte adiado.then()
para obter detalhes da implementação.fonte