El documento corto para .fail dice:
Agregue controladores para que se llamen cuando se rechace el objeto Diferido.
y el documento abreviado para .catch es exactamente el mismo:
Agregue controladores para que se llamen cuando se rechace el objeto Diferido.
Fuente: http://api.jquery.com/category/deferred-object/
Los argumentos aceptados por los dos métodos parecen ser diferentes, y el documento de .catch establece que .catch es un alias de .then(null, fn)
¿Hay casos en los que debo usar .fail y otros en los que debo usar .catch ?
O... si solo tengo una función... ¿los siguientes comandos son intercambiables y solo existen por compatibilidad/razones históricas?
a) .fail(fn) b) .catch(fn) c) .then(null, fn)Creé un jsFiddle:
https://jsfiddle.net/sq3mh9j5/
Si hay una diferencia, ¿podría proporcionar algunos ejemplos ya que soy nuevo en jquery y aún no estoy familiarizado con todos los términos de promesa?
¿Por qué el documento de .catch no hace referencia al documento de .fail y aclara la diferencia/similitud?
Editar Encontré algunas notas en las notas de la versión 3.0 que el comportamiento de .then cambió. https://blog.jquery.com/2015/07/13/jquery-3-0-and-jquery-compat-3-0-alpha-versions-released/ Sin embargo, todavía no estoy seguro de cuándo usar .fail y cuándo para usar .catch.
catch y fail son ligeramente diferentes, en el sentido de que catch devolverá una nueva promesa (resuelta), mientras que fail devolverá la promesa original.
// This will only output "fail" $.Deferred() .reject(new Error("something went wrong")) .fail(function() { console.log("fail"); }) .then(function() { console.log("then after fail"); }) // This will output "catch" and "then after catch" $.Deferred() .reject(new Error("something went wrong")) .catch(function() { console.log("catch"); }) .then(function() { console.log("then after catch"); }) Tenga en cuenta que catch(fn) es un alias de then(null, fn) .
Así que creo que la principal diferencia es lo que obtienes de cada uno.
Una captura le permite ejecutar una sola función.
Una falla le permite ejecutar una serie de funciones.
Aparte de eso, estoy de acuerdo con tus hallazgos. Ellos son muy similares.
Agregué un código de ejemplo para mostrar cómo el error ejecutará ambas funciones, y la captura solo ejecutará una.
$.ajax({ url: "abc" }).done(function (data) { }).fail(function () { alert("a"); }, function () { alert("b"); }) .catch(function () { alert("c"); }, function () { alert("d"); });Si ejecuta esto, obtiene 'a', 'b', 'c' y luego 'd' no se ejecuta.
Espero que este simple ejemplo muestre la diferencia.