Estoy usando $http
AngularJs, 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);
success
yerror
(prefiere.then
y en su.catch
lugar, puede (y debe) omitir elerrorFunction
del.then
uso accatch
como 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?.success
y.error
, $ http devuelve una promesa $ q con la adición de los controladoressuccess
yerror
; 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
success
yerror
mé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
success
yerror
no 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
success
yerror
devuelve la promesa original , es decir, la devuelta por$http.get
, el objeto pasado a la devolución de llamada delthen
es el objeto de usuario completo , es decir, la misma entrada a lasuccess
devolución de llamada anterior .Si hubiéramos encadenado dos
then
, esto habría sido menos confuso:fuente
success
yerror
son sólo añadidas a la devolución inmediata de la$http
llamada (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
success
yerror
están en desuso desde 1.4, tal vez sea mejor usar los métodos de promesa regularesthen
ycatch
y 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:
success
yerror
enfoque (success
yerror
devolver una promesa de una respuesta HTTP, por lo que necesitamos la ayuda de$q
para devolver una promesa de datos):then
ycatch
enfoque (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
throw
y de todos modos probablemente necesitará usar$q
para 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$q
hacemos que nuestra fábrica devuelva una promesa de datos en lugar de una promesa de respuesta HTTP.