qual é a diferença entre o método de sucesso e .done () de $ .ajax

102

Alguém pode me ajudar?
Eu não sou capaz de entender a diferença entresuccess e .done()de$.ajax .

Se possível, dê exemplos.

Poonam Bhatt
fonte
onde você leu sobre um método done () de $ .ajax ()? AFAIK, o método executado está relacionado ao objeto $ .Deferred. Talvez você esteja falando sobre .complete () em vez disso?
Fabrizio Calderan
1
na página api.jquery.com/jQuery.ajax
Poonam Bhatt
2
ok, é o jQuery 1.8 :) Como $ .ajax retornou uma promessa do jQuery 1.5, esta é uma substituição simples por uma questão de consistência (usando a interface de deferred): done () toma lugar de sucesso (), falha () para erro () e sempre () para completo ()
Fabrizio Calderan
2
A verdadeira mudança é que você pode anexar vários retornos de chamada programaticamente. Veja a página de documentação $ .Deferred.
Fabrizio Calderan

Respostas:

8

Em suma, desacoplar a função de retorno de chamada de sucesso da função ajax para que mais tarde você possa adicionar seus próprios manipuladores sem modificar o código original (padrão do observador).

Encontre informações mais detalhadas aqui: https://stackoverflow.com/a/14754681/1049184

batbaatar
fonte
1
E abaixo dele o exemplo mapeia a equivalência de concluído => sucesso, falha => erro e sempre => completo
StuartLC
25
Esta resposta perde o ponto. Há uma diferença entre success: usado como parâmetro e .success()como método em a jqXHR. Este último está sendo descontinuado, mas o primeiro é o que o OP estava perguntando.
Alnitak
2
Sucesso / erro / concluído foram descontinuados e baseados nas mudanças de estado do AJAX; done / fail / always são baseados nas mudanças de estado adiadas do jQuery. Consulte api.jquery.com/category/deferred-object .
mickeyreiss
28
Eu não posso acreditar em uma resposta que interpreta mal a questão é a solução mais votada e aceita ...
Transcendência
108

successsó dispara se a chamada AJAX for bem-sucedida, ou seja, em última análise, retorna um status HTTP 200. errordispara se falhar e completequando a solicitação for concluída, independentemente do sucesso.

No jQuery 1.8 no jqXHRobjeto (retornado por $.ajax) successfoi substituído por done, errorpor faile completeporalways .

No entanto, você ainda deve conseguir inicializar a solicitação AJAX com a sintaxe antiga. Então, eles fazem coisas semelhantes:

// set success action before making the request
$.ajax({
  url: '...',
  success: function(){
    alert('AJAX successful');
  }
});

// set success action just after starting the request
var jqxhr = $.ajax( "..." )
  .done(function() { alert("success"); });

Esta mudança é para compatibilidade com o objeto adiado do jQuery 1.5 . Adiado (e agora Promise, que tem suporte total ao navegador nativo no Chrome e FX) permite que você encadeie ações assíncronas:

$.ajax("parent").
    done(function(p) { return $.ajax("child/" + p.id); }).
    done(someOtherDeferredFunction).
    done(function(c) { alert("success: " + c.name); });

Essa cadeia de funções é mais fácil de manter do que uma pirâmide aninhada de callbacks que você obtém success.

No entanto, observe que doneagora está obsoleto em favor da Promisesintaxe que usa then:

$.ajax("parent").
    then(function(p) { return $.ajax("child/" + p.id); }).
    then(someOtherDeferredFunction).
    then(function(c) { alert("success: " + c.name); }).
    catch(function(err) { alert("error: " + err.message); });

Vale a pena adotar isso porque asynce awaitpromessas de extensão aprimorou a sintaxe (e tratamento de erros):

try {
    var p = await $.ajax("parent");
    var x = await $.ajax("child/" + p.id);
    var c = await someOtherDeferredFunction(x);
    alert("success: " + c.name);
}
catch(err) { 
    alert("error: " + err.message); 
}
Keith
fonte
criação da função antes de fazer a solicitação e definir a função após fazer a solicitação. Parece que os dois são iguais ... você vai me mostrar algumas outras diferenças ???
suhailvs
@suhail - não há nenhum; no jQuery 1.6 havia success, no jQuery 1.8 que foi substituído por done. Eles funcionam da mesma maneira, mas donesão mais consistentes com o resto do jQuery.
Keith
@Keith então hoje, usar .done é o mesmo que usar o sucesso? ou há algo ainda mais novo?
Roxy'Pro de
@ Roxy'Pro, isso estava desatualizado quando respondi, certamente não o usaria em 2018. .doneFoi uma tentativa inicial (e agora sem saída) da jQuery no que se tornou Promisee agora tem um suporte de linguagem bastante abrangente. Em novos projetos, eu usaria const response = await fetch(...).
Keith
6

.success() só é chamado se o seu servidor web responder com um cabeçalho HTTP 200 OK - basicamente quando está tudo bem.

Os callbacks anexados a done () serão disparados quando o adiado for resolvido. Os callbacks anexados a fail () serão disparados quando o adiado for rejeitado.

promise.done(doneCallback).fail(failCallback)

.done() has only one callback and it is the success callback
Sameera Thilakasiri
fonte
3
É importante notar que .success () NÃO é chamado quando um JSON malformado é enviado de volta com um código de status 200 / OK. Especificamente, encontrei um problema com o código de back-end do servidor da web gerando valores NaN e serializando-os como javascript NaN (ou seja, como um símbolo, não string 'NaN'), que na verdade não é JSON válido - portanto, a análise da resposta como JSON falha e .fail () é executado, mas o status de resposta é 200. Mas ainda é verdade que o sucesso SOMENTE é chamado com um código de status OK; só queria salientar que só porque está tudo bem, não significa que seja 'bem-sucedido';)
Kasapo
1

successé o retorno de chamada que é invocado quando a solicitação é bem-sucedida e faz parte da $.ajaxchamada. doneé na verdade parte do jqXHRobjeto retornado por $.ajax()e substitui successno jQuery 1.8.

devdigital
fonte