javascript - immediately - $ Q.reject() de angular versus deferred.reject()
promise angularjs (2)
Estoy tratando de manejar el servicio Angular $q
y sus objetos y API relacionados. Cuando miro los objetos en mi consola veo:
var deferred = $q.defer()
...(and then from console inspection)...
$q: Object {defer: function, reject: function, when: function, all: function}
deferred: Object {resolve: function, reject: function, notify: function, promise: Object}
deferred.promise: Object {then: function, catch: function, finally: function}
Plantea algunas preguntas:
- ¿Cuál es la diferencia entre
$q.reject()
ydeferred.reject()
? Cuándo usar cada uno? - ¿Cuál es la relación entre el
errorFn
endeferred.promise.then(successFn, errorFn)
ycatchFn
endeferred.promise.catch(catchFn)
? - Si tengo un montón de promesas anidadas y se produce un error, ¿se llamará siempre a la función
catch()
más externa? ¿Qué sucede si una de las promesas anidadas también tiene definida una función catch? ¿Esa captura evitará que se ejecute la captura más externa?
Gracias.
Ok, este es mi punto de vista de las promesas.
$q.reject(reason)
devuelve una promesa rechazada con el motivo pasado como argumento y desviado. Rechazar rechaza un existente que se haya otorgado independientemente de si su proceso ha finalizado o no.errorFn
se inicia cuando se rechaza una promesa y su argumento es el motivo por el que se rechazó. Se invoca Catch cuando un error dentro del proceso de promesa no se manejó correctamente, lo que provocó la promesa de generar y de excepción, y no fue rechazado ni cumplido.No deberías tener promesas anidadas, deberías tener promesas encadenadas, en cuyo caso el último bloque catch debería capturar todo antes si no se ha especificado otro bloque para manejarlo.
1) $q.reject()
es un atajo para crear un diferido y luego rechazarlo inmediatamente; A menudo uso esto en un errorFn si no puedo manejar el error.
2) Nada, promise.catch(errorFn)
es simplemente azúcar sintáctico para promise.then(null, errorFn)
, al igual que los métodos de éxito y error del servicio $http
, para que pueda escribir código como el siguiente:
promise.
then(function(result){
// handle success
return result;
}, function errorHandler1(error){
// handle error, exactly as if this was a separate catch in the chain.
}).catch(function errorHandler2(error){
// handle errors from errorHandler1
});
3) Aquí es exactamente donde $ q.reject puede ser útil:
promise.
catch(function(error){
//Decide you can''t handle the error
return $q.reject(error); //This forwards the error to the next error handler;
}).catch(function(error){
// Here you may handle the error or reject it again.
return ''An error occurred'';
//Now other errorFn in the promise chain won''t be called,
// but the successFn calls will.
}).catch(function(error){
// This will never be called because the previous catch handles all errors.
}).then(function(result){
//This will always be called with either the result of promise if it was successful, or
//''An error occured'' if it wasn''t
});