Devo usar .done () e .fail () para o novo código jQuery AJAX em vez de êxito e erro

166

Eu codifiquei assim:

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID },
    success: function (data) {
        $('#CityID').html(data);
    },
    error: function (ajaxContext) {
        alert(ajaxContext.responseText)
    }
});

Mas quando olho para a .ajax()documentação do jQuery no final, parece sugerir que eu deveria codificar como este abaixo ou pelo menos sugere adicionar um .done()e um .fail():

var request = $.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
});

request.done(function (data) {
    xxx;
});
request.fail(function (jqXHR, textStatus) {
    xxx;
});

Atualizar

Se eu codifico assim, é o mesmo ou há alguma vantagem em dividi-lo em três?

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
}).done(function (data) {
    xxx;
}).fail(function (jqXHR, textStatus) {
    xxx;
});
Alan2
fonte

Respostas:

164

Conforme declarado pelo usuário2246674, o uso de successe errorcomo parâmetro da função ajax é válido.

Para ser consistente com a resposta precedente, leia o documento:

Aviso de descontinuação :

Os retornos de chamada jqXHR.success (), jqXHR.error () e jqXHR.complete () serão descontinuados no jQuery 1.8. Para preparar seu código para sua eventual remoção, use jqXHR.done (), jqXHR.fail () e jqXHR.always ().

Se você estiver usando a função de retorno de manipulação de (usando, por exemplo,-encadeamento método), o uso .done(), .fail()e .always()em vez de success(), error()e complete().

Michael Laffargue
fonte
54
Discordo. As referências falam sobre as funções de manipulação de retorno de chamada (por exemplo .error, .success) que foram descontinuadas em favor do padrão Diferido mais universal, mas os parâmetros para o ajaxmétodo não são descontinuados e são válidos e aceitáveis ​​- mesmo no jQuery 1.9 / 2.0! Em todas as formas atuais, ajaxainda retorna um adiado; possivelmente com retornos de chamada adiados já anexados.
user2246674
1
Aqui está, jQuery 1.9, e success :, error: e complete: ainda são utilizáveis. No entanto, minha pergunta é: .done () == para o sucesso:?
TARKUS
3
@GregoryLewis De JQuery 1.10 código fonte: jqXHR.success = jqXHR.done;.
Michael Laffargue
9
Eu honestamente prefiro success, fail, always.
ahnbizcad
4
WOW, eu também li mal a documentação. Eu literalmente pensei que as opções de 'sucesso' / 'erro' para $ .ajax foram reescritas para 'pronto / reprovado'. Foram apenas as cadeias de métodos de retorno de chamada. Honestamente, acho que eles deveriam ter mudado os nomes das opções também. Isso me deixou perplexo por horas.
OzzyTheGiant
12

Quero adicionar algo na publicação de @Michael Laffargue:

jqXHR.done() é mais rápido!

jqXHR.success()têm algum tempo de carregamento no retorno de chamada e às vezes podem exagerar no script. Acho isso da maneira mais difícil antes.

ATUALIZAR:

Usando jqXHR.done(), jqXHR.fail()e jqXHR.always()você pode melhor manipular com o pedido ajax. Geralmente, você pode definir ajax em alguma variável ou objeto e usar essa variável ou objeto em qualquer parte do seu código e obter dados mais rapidamente. Bom exemplo:

/* Initialize some your AJAX function */
function call_ajax(attr){
    var settings=$.extend({
        call            : 'users',
        option          : 'list'
    }, attr );

    return $.ajax({
        type: "POST",
        url: "//exapmple.com//ajax.php",
        data: settings,
        cache : false
    });
}

/* .... Somewhere in your code ..... */

call_ajax({
    /* ... */
    id : 10,
    option : 'edit_user'
    change : {
          name : 'John Doe'
    }
    /* ... */
}).done(function(data){

    /* DO SOMETHING AWESOME */

});
Ivijan Stefan Stipić
fonte
9
Você tem alguma referência credível e verificável?
Paul Vargas
@PaulVargas Eu nunca faço algum teste de desempenho, mas na minha prática acho que isso funciona. Você pode tentar sozinho.
Ivijan Stefan Stipić
1
Forneça qualquer evidência que seja confiável.
Wonsuc 28/08/19
Como você sabe, as funções de retorno de chamada são mais lentas se comparadas ao retorno de alguns objetos da função. Às vezes é de pequeno impacto, mas às vezes pode ser enorme se você tiver muitas chamadas.
Ivijan Stefan Stipić 13/03/19
7

Em palavras simples

$.ajax("info.txt").done(function(data) {
  alert(data);
}).fail(function(data){
  alert("Try again champ!");
});

se receber o info.text, ele alertará e qualquer função que você adicionar ou, se houver alguma, incapaz de recuperar o info.text do servidor, alertará ou alertará a função de erro.

Yasir
fonte
0

Quando migrarmos o JQuery de 1.x para 2x ou 3.x em nosso aplicativo existente antigo, usaremos .done, .fail em vez de êxito, o erro, pois a gradação de classificação do JQuery será preterida nesses métodos. Por exemplo, quando fazemos uma chamada para métodos da web do servidor, o servidor retorna objetos prometidos aos métodos de chamada (métodos Ajax) e esses objetos promissores contêm os métodos .done, .fail..etc. Abaixo está o exemplo (é para solicitação POST da mesma maneira que podemos construir para o tipo de solicitação como GET ...)

 $.ajax({
            type: "POST",
            url: url,
            data: '{"name" :"sheo"}',
            contentType: "application/json; charset=utf-8",
            async: false,
            cache: false
            }).done(function (Response) {
                  //do something when get response            })
           .fail(function (Response) {
                    //do something when any error occurs.
                });
Sheo Dayal Singh
fonte