Aktualizacja:
Aby pomóc przyszłym widzom tego posta, stworzyłem to demo odpowiedzi Plumy .
Pytanie:
Mój cel wydaje się dość prosty.
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);
}
Problem polega na tym, że jeśli nie uda mi się w kroku 1, oba stepError(1)
ORAZ stepError(2)
są uruchamiane. Jeśli nie return $q.reject
wtedy stepError(2)
nie zostanie zwolniony, ale step(2)
będzie, co rozumiem. Osiągnąłem wszystko oprócz tego, co próbuję zrobić.
Jak napisać obietnice, aby móc wywołać funkcję w przypadku odrzucenia, bez wywoływania wszystkich funkcji w łańcuchu błędów? Czy jest inny sposób na osiągnięcie tego?
Oto demonstracja na żywo, więc masz coś do zrobienia.
Aktualizacja:
W pewnym sensie to rozwiązałem. Tutaj wyłapuję błąd na końcu łańcucha i przekazuję dane do, reject(data)
żeby wiedzieć, jaki problem obsłużyć w funkcji błędu. To właściwie nie spełnia moich wymagań, ponieważ nie chcę polegać na danych. Byłoby kiepskie, ale w moim przypadku czystsze byłoby przekazanie wywołania zwrotnego błędu do funkcji, zamiast polegać na zwracanych danych w celu ustalenia, co należy zrobić.
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()
przykłady na MDN pokazują rozwiązania dla dokładnie tych samych problemów.