success
ha sido el nombre tradicional de la devolución de llamada exitosa en jQuery, definida como una opción en la llamada ajax. Sin embargo, desde la implementación de $.Deferreds
devoluciones de llamada más sofisticadas, done
es la forma preferida de implementar devoluciones de llamada exitosas, ya que se puede invocar en cualquiera deferred
.
Por ejemplo, el éxito:
$.ajax({
url: '/',
success: function(data) {}
});
Por ejemplo, hecho:
$.ajax({url: '/'}).done(function(data) {});
Lo bueno done
es que el valor de retorno de $.ajax
ahora es una promesa diferida que puede vincularse a cualquier otro lugar de su aplicación. Digamos que desea hacer esta llamada ajax desde diferentes lugares. En lugar de pasar en su función de éxito como una opción para la función que hace que esta llamada AJAX, sólo puede tener la función de retorno $.ajax
a sí mismo y se unen sus devoluciones de llamada con done
, fail
, then
, o lo que sea. Tenga en cuenta que always
es una devolución de llamada que se ejecutará si la solicitud tiene éxito o falla. done
solo se activará en caso de éxito.
Por ejemplo:
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
});
Un beneficio importante de esto en términos de mantenibilidad es que ha incluido su mecanismo ajax en una función específica de la aplicación. Si decide que necesita su $.ajax
llamada para operar de manera diferente en el futuro, o usa un método ajax diferente, o se aleja de jQuery, solo tiene que cambiar la xhr_get
definición (asegúrese de devolver una promesa o al menos un done
método, en El caso del ejemplo anterior). Todas las demás referencias en la aplicación pueden seguir siendo las mismas.
Hay muchas cosas más (mucho más geniales) con las que puede hacer $.Deferred
, una de las cuales es usar pipe
para desencadenar una falla en un error informado por el servidor, incluso cuando la $.ajax
solicitud en sí misma tiene éxito. Por ejemplo:
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
});
Lea más sobre $.Deferred
aquí: http://api.jquery.com/category/deferred-object/
NOTA : A partir de jQuery 1.8, pipe
ha quedado en desuso a favor de usarlo then
exactamente de la misma manera.
success:
/.done()
, en todo caso. Por ejemplo, ¿success:
solo se implementa como el primero en.done()
estos días?success:
y.done
en una llamada ajax? Buena pregunta. Como todas las demás devoluciones de llamada se llaman en el orden en que están vinculadas, supongo que sí,success
solo se llama primero.pipe
es uno en el que la solicitud en sí tiene éxito pero el script en el servidor no devolvió lo que estaba buscando. Es posible que no desee arrojar un 404 o 500 real o lo que sea en el lado del servidor porque desea distinguir significativamente entre las respuestas http y las respuestas de la aplicación. Establecer un código de respuesta en el JSON y luego usarlo depipe
esta manera le permite manejar diferentes tipos de errores con más matices.Si necesita
async: false
en su ajax, debe usar ensuccess
lugar de.done
. De lo contrario, es mejor usar.done
. Esto es del sitio oficial de jQuery :fuente
async:false
?$.ajax({ url: req_url, ..., async: false, success: function (result, status, req) { }, error: function (jqXHR, status) { } });
Los objetos jqXHR devueltos por
$.ajax()
jQuery 1.5 implementan la interfaz Promise, dándoles todas las propiedades, métodos y comportamiento de una Promesa (consulte Objeto diferido para obtener más información). Estos métodos toman uno o más argumentos de función que se invocan cuando$.ajax()
finaliza la solicitud. Esto le permite asignar múltiples devoluciones de llamada en una sola solicitud, e incluso asignar devoluciones de llamada después de que la solicitud se haya completado. (Si la solicitud ya está completa, la devolución de llamada se activa inmediatamente). Los métodos de Promesa disponibles del objeto jqXHR incluyen:Una construcción alternativa a la opción de devolución de llamada exitosa, consulte los
deferred.done()
detalles de implementación.Una construcción alternativa a la opción de devolución de llamada de error, el
.fail()
método reemplaza el método .error () en desuso. Consulte deferred.fail () para obtener detalles de implementación.(agregado en jQuery 1.6) Una construcción alternativa a la opción de devolución de llamada completa, el
.always()
método reemplaza el.complete()
método en desuso .En respuesta a una solicitud exitosa, los argumentos de la función son los mismos que los de
.done()
: data, textStatus y el objeto jqXHR. Para solicitudes fallidas, los argumentos son los mismos que los de.fail()
: el objeto jqXHR, textStatus y errorThrown. Consultedeferred.always()
para detalles de implementación.Incorpora la funcionalidad de los métodos
.done()
y.fail()
, lo que permite (a partir de jQuery 1.8) manipular la promesa subyacente. Consulte diferido.then()
para obtener detalles de implementación.fuente