Según el documento de AngularJS , las llamadas $http
devuelven lo siguiente:
Devuelve un objeto de promesa con el método estándar de entonces y dos métodos específicos http: éxito y error . El método then toma dos argumentos, un éxito y una devolución de llamada de error que se llamará con un objeto de respuesta. Los métodos de éxito y error toman un solo argumento, una función que se llamará cuando la solicitud tenga éxito o falle, respectivamente. Los argumentos pasados a estas funciones son una representación desestructurada del objeto de respuesta pasado al método then.
Aparte del hecho de que el response
objeto está desestructurado en un caso, no obtengo la diferencia entre
- las devoluciones de llamada de éxito / error pasadas para pasar como argumentos de
promise.then
- las devoluciones de llamada pasadas como argumentos para los métodos
promise.success
/promise.error
de la promesa
¿Hay alguna? ¿Cuál es el punto de estas dos formas diferentes de pasar devoluciones de llamada aparentemente idénticas?
then
devoluciones de llamada toman un solo argumento - la respuesta -, mientras quesuccess
yerror
tomar los componentes individuales de la respuesta como arguments--data
,status
,header
, yconfig
..success()
método devuelve el objeto de promesa $ http original, ya que la cadena$http(...).success(...).error(...)
es posible. Si, como parece razonable, lo inverso$http(...).error(...).success(...)
también es posible, entonces.error()
también debería devolver el objeto de promesa original. La diferencia distintiva de.then()
es que devuelve una nueva promesa.promise.success = function(fn) { promise.then(function(response) { fn(response.data, response.status, response.headers, config); }); return promise; };
success
ha quedado en desuso. De docs.angularjs.org/api/ng/service/$http#deprecation-noticeThe $http legacy promise methods success and error have been deprecated. Use the standard then method instead. If $httpProvider.useLegacyPromiseExtensions is set to false then these methods will throw $http/legacy error.
Ya hay algunas buenas respuestas aquí. Pero vale la pena conducir a casa la diferencia en el paralelismo ofrecido:
success()
devuelve la promesa originalthen()
devuelve una nueva promesaLa diferencia es que
then()
impulsa operaciones secuenciales, ya que cada llamada devuelve una nueva promesa.$http.get()
seqFunc1()
seqFunc2()
success()
impulsa operaciones paralelas, ya que los manejadores están encadenados en la misma promesa.$http.get()
parFunc1()
,parFunc2()
En paralelofuente
then
se llega a un resultado en los métodossuccess
yerror
desaparecer. También, para http respuestas de error (por ejemplo, 404) la primerathen
enhttp.then(ok, err).then(ok, err)
pasará alerr
controlador pero los siguientes pasará en elok
controlador. Básicamentehttp.success().error().success().error()
son encadenables, pero las promesas de $ q son bastante diferentes, ya que se trata de la promesa y la secuencia de manejo específicamente (y no del manejo de solicitudes http). Me costó entender esto hasta que lo miré de cerca.success
yerror
no son API normales de una promesa, se atornillan al valor de retorno de $ http ().success
se ejecutará después de que se haya ejecutado el primero, pero antes de que se resuelva cualquier promesa que se le devuelva, mientras que el segundothen
esperará. Si no está devolviendo promesas, ambos se comportan igual.Algunos ejemplos de código para una simple solicitud GET. Quizás esto ayude a entender la diferencia. Utilizando
then
:Usando
success
/error
:fuente
data,status,header,config
en lugar de simplemente regresarresponse
?.then () es encadenable y esperará a que se resuelva el anterior .then ().
.success () y .error () se pueden encadenar, pero todos se dispararán a la vez (por lo que no tiene mucho sentido)
.success () y .error () son simplemente buenos para llamadas simples (creadores fáciles):
para que no tenga que escribir esto:
Pero generalmente manejo todos los errores con .catch ():
Si necesita admitir <= IE8, escriba su .catch () y .finally () de esta manera (métodos reservados en IE):
Ejemplos de trabajo:
Aquí hay algo que escribí en formato más codey para refrescar mi memoria sobre cómo funciona todo con errores de manejo, etc.
http://jsfiddle.net/nalberg/v95tekz2/
fuente
Solo para completar, aquí hay un ejemplo de código que indica las diferencias:
éxito \ error:
luego:
fuente
Aviso oficial: el éxito y el error han quedado en desuso, utilice el método estándar y luego en su lugar.
enlace: https://code.angularjs.org/1.5.7/docs/api/ng/service/$http
captura de pantalla: ver la captura de pantalla
fuente