Обновить:
Чтобы помочь будущим зрителям этого поста, я создал демо-версию ответа Pluma .
Вопрос:
Моя цель кажется довольно простой.
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);
}
Проблема здесь заключается в том, что, если мне не удается выполнить шаг 1, оба stepError(1)
оператора И stepError(2)
запускаются. Если я этого не сделаю, return $q.reject
то меня не stepError(2)
уволят, а step(2)
будут, что я понимаю. Я достиг всего, кроме того, что я пытаюсь сделать.
Как мне написать обещания, чтобы я мог вызвать функцию при отклонении, не вызывая все функции в цепочке ошибок? Или есть другой способ сделать это?
Вот живая демонстрация, так что у вас есть с чем поработать.
Обновить:
Я вроде решил это. Здесь я перехватываю сообщение об ошибке в конце цепочки и передаю данные, чтобы reject(data)
узнать, какую проблему нужно решить в функции ошибки. Это на самом деле не соответствует моим требованиям, потому что я не хочу зависеть от данных. Это было бы неэффективно, но в моем случае было бы яснее передать функцию обратного вызова с ошибкой, а не зависеть от возвращаемых данных, чтобы определить, что делать.
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()
примеры на MDN показывают решение точно таких же проблем.