Actualizar:
Para ayudar a los futuros espectadores de esta publicación, creé esta demostración de la respuesta de pluma .
Pregunta:
Mi objetivo parece bastante sencillo.
step(1)
.then(function() {
return step(2);
}, function() {
stepError(1);
return $q.reject();
})
.then(function() {
}, function() {
stepError(2);
});
function step(n) {
var deferred = $q.defer();
//fail on step 1
(n === 1) ? deferred.reject() : deferred.resolve();
return deferred.promise;
}
function stepError(n) {
console.log(n);
}
El problema aquí es que si fallo en el paso 1, ambos stepError(1)
Y stepError(2)
son despedidos. Si no lo hago return $q.reject
entonces stepError(2)
no va a ser despedido, pero step(2)
lo hará, que entiendo. He logrado todo excepto lo que estoy tratando de hacer.
¿Cómo escribo promesas para poder llamar a una función en caso de rechazo, sin llamar a todas las funciones en la cadena de error? ¿O hay otra forma de lograr esto?
Aquí hay una demostración en vivo para que tenga algo con lo que trabajar.
Actualizar:
De alguna manera lo he resuelto. Aquí, estoy captando el error al final de la cadena y pasando los datos para reject(data)
que sepa qué problema manejar en la función de error. En realidad, esto no cumple con mis requisitos porque no quiero depender de los datos. Sería lamentable, pero en mi caso sería más limpio pasar una devolución de llamada de error a la función en lugar de depender de los datos devueltos para determinar qué hacer.
Demostración en vivo aquí (clic).
step(1)
.then(function() {
return step(2);
})
.then(function() {
return step(3);
})
.then(false,
function(x) {
stepError(x);
}
);
function step(n) {
console.log('Step '+n);
var deferred = $q.defer();
(n === 1) ? deferred.reject(n) : deferred.resolve(n);
return deferred.promise;
}
function stepError(n) {
console.log('Error '+n);
}
Promise.prototype.catch()
ejemplos en MDN muestran solución para exactamente los mismos problemas.