Разорвать цепочку обещаний и вызвать функцию, основанную на шаге в цепочке, где она нарушена (отклонено)
Чтобы помочь будущим зрителям этого поста, я создалэто демо 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);
}