Оновлення:
Щоб допомогти майбутнім глядачам цього допису, я створив цю демонстрацію відповіді 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 показують вирішення точно таких же проблем.