2012-01-13 15 views
89

¿Alguien me puede ayudar?
No puedo entender la diferencia entre success y .done() de $.ajax.

Si es posible, den ejemplos.

+0

¿Dónde leíste sobre un método done() de $ .ajax()? AFAIK el método hecho está relacionado con el objeto $. Diferido. ¿Tal vez estás hablando de .complete() en su lugar? – fcalderan

+1

en http://api.jquery.com/jQuery.ajax/page –

+2

ok, es jQuery 1.8 :) Como $ .ajax devuelve una promesa de jQuery 1.5, esta es una simple sustitución por una cuestión de consistencia (utilizando la interfaz de diferido): done() tiene lugar de success(), falla() para error() y siempre() para completar() – fcalderan

Respuesta

8

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

por favor, encontrar información más detallada de aquí: https://stackoverflow.com/a/14754681/1049184

+1

Y debajo de él, el ejemplo muestra la equivalencia de done => success, fail => error y always => complete – StuartLC

+23

Esta respuesta pierde el sentido. Hay una diferencia entre 'success:' usado como parámetro y '.success()' como método en 'jqXHR'. Este último está en desuso, pero el primero es lo que el OP estaba preguntando. – Alnitak

+1

Success/error/complete están en desuso y en función de los cambios de estado de AJAX; done/fail/always se basan en jQuery Cambios de estado diferidos. Ver http://api.jquery.com/category/deferred-object/. – mickeyreiss

90

success solo se activa si la llamada AJAX tiene éxito, es decir, devuelve un estado HTTP 200. error se dispara si falla y complete cuando finaliza la solicitud, independientemente de su éxito.

En jQuery 1.8 en la jqXHR objeto (devuelto por $.ajax) success se reemplazó con done, error con fail y complete con always.

Sin embargo, todavía debe ser capaz de inicializar la solicitud AJAX con la sintaxis anterior. Por lo que 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 para la compatibilidad con jQuery 1.5 de deferred object. Diferidos (y ahora Promise, que cuenta con el apoyo del navegador nativa completa en Chrome y FX) que permiten a la cadena de acciones asíncronos:

$.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 jerarquizada de las devoluciones de llamada que se obtiene con success.

Sin embargo, tenga en cuenta que done ahora es obsoleto en favor de la sintaxis Promise que utiliza then lugar:

$.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); }); 

Esto vale la pena adoptar porque async y await se extienden promesas mejora de sintaxis (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); 
} 
+0

creación de funciones antes de realizar la solicitud y establecer la función después de realizar la solicitud. Parece que ambos son lo mismo ... ¿me mostrarán algunas otras diferencias? – suhailvs

+0

@suhail - en realidad no hay ninguno; en jQuery 1.6 hubo 'success', en jQuery 1.8 que ha sido reemplazado por' done'. Funcionan de la misma manera, pero 'done' es más consistente con el resto de jQuery. – Keith

0

success es la devolución de llamada que se invoca cuando la solicitud tiene éxito y es parte de la llamada $.ajax. done es en realidad parte del objeto jqXHR devuelto por $.ajax(), y reemplaza success en jQuery 1.8.

5

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

Las devoluciones de llamada asociadas a done() se dispararán cuando se resuelva el aplazamiento. Las devoluciones de llamada asociadas a fail() se dispararán cuando se rechace el diferido.

promise.done(doneCallback).fail(failCallback) 

.done() has only one callback and it is the success callback 
+2

Vale la pena señalar que .success() NO recibe una llamada cuando el JSON malformado se envía de vuelta con un código de estado 200/OK. Específicamente, me encontré con un problema con el código backend del servidor web que genera valores NaN y serialándolos como javascript NaN (es decir, como un símbolo, no 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 sigue siendo cierto que el éxito SÓLO se llama con un código de estado correcto; solo quería señalar que solo porque está bien, no significa que sea 'exitoso';) – Kasapo

Cuestiones relacionadas