cuál es la diferencia entre el éxito y el método .done () de $ .ajax

102

¿Alguien puede ayudarme?
No puedo entender la diferencia entre successy .done()de $.ajax.

Si es posible, dé ejemplos.

Poonam Bhatt
fuente
¿Dónde leíste sobre un método done () de $ .ajax ()? AFAIK, el método done está relacionado con $ .Deferred object. ¿Quizás estás hablando de .complete () en su lugar?
Fabrizio Calderan
1
en la página api.jquery.com/jQuery.ajax
Poonam Bhatt
2
ok, es jQuery 1.8 :) Dado que $ .ajax devuelve una promesa de jQuery 1.5, esta es una simple sustitución por una cuestión de consistencia (usando la interfaz de diferido): done () toma el lugar del éxito (), falla () para el error () y siempre () para completar ()
Fabrizio Calderan
2
El verdadero cambio es que puede adjuntar varias devoluciones de llamada mediante programación. Mire la página de documentación $ .Deferred.
Fabrizio Calderan

Respuestas:

8

En resumen, desacoplar la función de devolución de llamada exitosa de la función ajax para que luego pueda agregar sus propios controladores sin modificar el código original (patrón de observador).

Encuentre información más detallada desde aquí: https://stackoverflow.com/a/14754681/1049184

batbaatar
fuente
1
Y debajo, el ejemplo traza la equivalencia de hecho => éxito, error => error y siempre => completo
StuartLC
25
Esta respuesta pierde el punto. Existe una diferencia entre success: usado como parámetro y .success()como método en un jqXHR. El último está siendo desaprobado, pero el primero es sobre lo que estaba preguntando el OP.
Alnitak
2
Éxito / error / completado están obsoletos y se basan en los cambios de estado de AJAX; done / fail / always se basan en los cambios de estado diferidos de jQuery. Consulte api.jquery.com/category/deferred-object .
mickeyreiss
28
No puedo creer que una respuesta que malinterprete la pregunta sea la solución más votada y la más aceptada ...
Trascendencia
108

successsolo se activa si la llamada AJAX es exitosa, es decir, finalmente devuelve un estado HTTP 200. errorse activa si falla y completecuando finaliza la solicitud, independientemente del éxito.

En jQuery 1.8 en el jqXHRobjeto (devuelto por $.ajax) successfue reemplazado con done, errorcon faily completeconalways .

Sin embargo, aún debería poder inicializar la solicitud AJAX con la sintaxis anterior. Entonces estos hacen cosas similares:

// 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"); });

Este cambio es por compatibilidad con el objeto diferido de jQuery 1.5 . Diferido (y ahora Promise, que tiene soporte completo para navegadores nativos en Chrome y FX) le permite encadenar acciones asincrónicas:

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

Esta cadena de funciones es más fácil de mantener que una pirámide anidada de devoluciones de llamada con la que obtiene success.

Sin embargo, tenga en cuenta que doneahora está en desuso a favor de la Promisesintaxis que usa en su thenlugar:

$.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 la pena adoptar esto porque asyncy awaitextender promete una sintaxis mejorada (y manejo de errores):

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
fuente
creación de funciones antes de realizar la solicitud y configurar la función después de realizar la solicitud. Parece que ambos son iguales ... ¿Me mostrarás otras diferencias?
suhailvs
@suhail - realmente no hay ninguno; en jQuery 1.6 había success, en jQuery 1.8 que ha sido reemplazado por done. Funcionan de la misma manera, pero donees más coherente con el resto de jQuery.
Keith
@Keith entonces, ¿usar .done es lo mismo que usar Success? ¿O hay algo más nuevo?
Roxy'Pro
@ Roxy'Pro, esto estaba desactualizado cuando lo respondí, ciertamente no lo usaría en 2018.Fue .donela primera (y ahora callejón sin salida) de jQuery sobre lo que se convirtió Promisey que ahora tiene un soporte de lenguaje bastante completo. En nuevos proyectos, usaría const response = await fetch(...)en su lugar.
Keith
6

.success() solo se llama si su servidor web responde con un encabezado HTTP 200 OK, básicamente cuando todo está bien.

Las devoluciones de llamada adjuntas a done () se activarán cuando se resuelva el aplazado. Las devoluciones de llamada adjuntas a fail () se activarán cuando se rechace el aplazado.

promise.done(doneCallback).fail(failCallback)

.done() has only one callback and it is the success callback
Sameera Thilakasiri
fuente
3
Vale la pena señalar que .success () NO se llama cuando JSON con formato incorrecto se devuelve con un código de estado 200 / OK. Específicamente, me encontré con un problema con el código de backend del servidor web que genera valores NaN y los serializa como javascript NaN (es decir, como un símbolo, no una cadena 'NaN') que en realidad no es JSON válido, por lo que el análisis de la respuesta como JSON falla y se ejecuta .fail (), pero el estado de respuesta es 200. Pero aún es cierto que el éxito SÓLO se llama con un código de estado OK; solo quería señalar que solo porque está bien, no significa que sea 'exitoso';)
Kasapo
1

successes la devolución de llamada que se invoca cuando la solicitud es exitosa y es parte de la $.ajaxllamada. donees en realidad parte del jqXHRobjeto devuelto por $.ajax()y reemplaza successen jQuery 1.8.

devdigital
fuente