更新:
为了帮助将来的读者,我创建了pluma's answer的此演示。
题:
我的目标似乎很简单。
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)
AND都会stepError(2)
被触发。如果我不return $q.reject
那么stepError(2)
就不会被解雇,但是step(2)
会,我明白了。除了我想做的以外,我已经完成了所有工作。
如何编写promise,以便我可以在拒绝时调用函数,而无需调用错误链中的所有函数?还是有另一种方法可以做到这一点?
这是现场演示因此您可以进行一些工作。
更新:
我有点解决了。在这里,我在链的末尾捕获错误,并将数据传递给reject(data)
我,以便我知道要在错误函数中处理什么问题。这实际上不符合我的要求,因为我不想依赖数据。会很la脚,但就我而言,将错误回调传递给函数将比使用返回的数据来确定执行操作更干净。
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上的示例显示了完全相同的问题的解决方案。