Estoy usando $httpAngularJs, y no estoy seguro de cómo usar la promesa devuelta y manejar los errores.
Tengo este codigo:
$http
.get(url)
.success(function(data) {
// Handle data
})
.error(function(data, status) {
// Handle HTTP error
})
.finally(function() {
// Execute logic independent of success/error
})
.catch(function(error) {
// Catch and handle exceptions from success/error/finally functions
});
¿Es esta una buena forma de hacerlo o hay una forma más sencilla?

success(),error()yfinally()combinado concatch()? O tengo que usarthen(successFunction, errorFunction).catch(exceotionHandling).then(cleanUp);successyerror(prefiere.theny en su.catchlugar, puede (y debe) omitir elerrorFunctiondel.thenuso accatchcomo en mi código anterior).success/error? Además, mi Eclipse se vuelve loco cuando ve el.catch(, así que lo uso["catch"](por ahora. ¿Cómo puedo domesticar a Eclipse?.successy.error, $ http devuelve una promesa $ q con la adición de los controladoressuccessyerror; sin embargo, estos controladores no se encadenan y generalmente deben evitarse si es posible. En general, si tiene preguntas, es mejor plantearlas como una pregunta nueva y no como un comentario sobre una anterior.Olvidarse de usar
successyerrormétodo.Ambos métodos han quedado obsoletos en angular 1.4. Básicamente, la razón detrás de la desaprobación es que no se pueden encadenar , por así decirlo.
Con el siguiente ejemplo, voy a tratar de demostrar lo que quiero decir acerca
successyerrorno siendo chainable ambiente . Supongamos que llamamos a una API que devuelve un objeto de usuario con una dirección:Objeto de usuario:
Llamar a la API:
¿Que pasó?
Porque
successyerrordevuelve la promesa original , es decir, la devuelta por$http.get, el objeto pasado a la devolución de llamada delthenes el objeto de usuario completo , es decir, la misma entrada a lasuccessdevolución de llamada anterior .Si hubiéramos encadenado dos
then, esto habría sido menos confuso:fuente
successyerrorson sólo añadidas a la devolución inmediata de la$httpllamada (no el prototipo), por lo que si se llama a otro método promesa entre ellos (como, normalmente llamamosreturn $http.get(url)envuelto en una biblioteca de la base, pero más tarde decide cambiar una ruleta en la llamada a la biblioteca conreturn $http.get(url).finally(...)), entonces ya no tendrá esos métodos convenientes.Creo que las respuestas anteriores son correctas, pero aquí hay otro ejemplo (solo un fyi, success () y error () están en desuso de acuerdo con la página principal de AngularJS :
fuente
¿Qué tipo de granularidad está buscando? Por lo general, puede arreglárselas con:
Descubrí que "finalmente" y "captura" están mejor cuando se encadenan múltiples promesas.
fuente
loading = false).catch()métodoEn el caso de Angular $ http, la función success () y error () tendrá el objeto de respuesta desenvuelto, por lo que la firma de devolución de llamada sería como $ http (...). Success (function (data, status, headers, config))
para then (), probablemente tratará con el objeto de respuesta en bruto. como publicado en el documento API AngularJS $ http
El último .catch (...) no será necesario a menos que haya un nuevo error en la cadena de promesa anterior.
fuente
Lo hago como sugiere Bradley Braithwaite en su blog :
Es bastante estable y seguro y si tienes otras condiciones para rechazar la promesa siempre puedes filtrar tus datos en la función de éxito y llamar
deferred.reject(anotherReason)con el motivo del rechazo.Como sugirió Ryan Vice en los comentarios , esto puede no ser visto como útil a menos que juegues un poco con la respuesta, por así decirlo.
Porque
successyerrorestán en desuso desde 1.4, tal vez sea mejor usar los métodos de promesa regularesthenycatchy transformar la respuesta dentro de esos métodos y devolver la promesa de que la respuesta transformada.Estoy mostrando el mismo ejemplo con ambos enfoques y un tercer enfoque intermedio:
successyerrorenfoque (successyerrordevolver una promesa de una respuesta HTTP, por lo que necesitamos la ayuda de$qpara devolver una promesa de datos):thenycatchenfoque (esto es un poco más difícil de probar, debido al lanzamiento):Sin embargo, hay una solución a mitad de camino (de esta manera puede evitar el
throwy de todos modos probablemente necesitará usar$qpara simular el comportamiento de la promesa en sus pruebas):Cualquier tipo de comentarios o correcciones son bienvenidos.
fuente
success()yerror()no devolvería una nueva promesa como lothen()hace. Con$qhacemos que nuestra fábrica devuelva una promesa de datos en lugar de una promesa de respuesta HTTP.