【发布时间】:2014-01-09 22:55:54
【问题描述】:
更新:
为了帮助这篇文章的未来观众,我创建了 this demo of 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) 和 stepError(2) 都会被解雇。如果我不return $q.reject,那么stepError(2) 不会被解雇,但step(2) 会,我理解。除了我想做的事情,我已经完成了所有事情。
如何编写 Promise 以便在拒绝时调用函数,而不调用错误链中的所有函数?还是有其他方法可以做到这一点?
Here's a live demo 所以你有一些工作要做。
更新:
我有点已经解决了。在这里,我在链的末尾捕获错误并将数据传递给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);
}
【问题讨论】:
-
有一个异步 javascript 库,如果这变得更复杂,可能会有所帮助
-
Promise.prototype.catch()examples on MDN 显示完全相同问题的解决方案。
标签: javascript angularjs promise