Обновлять:
Чтобы помочь будущим зрителям этого сообщения, я создал эту демонстрацию ответа 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 показать решение для тех же самых проблем. - person toraritte   schedule 11.09.2018