为了帮助这篇文章的未来观众,我创建了 这个李子的答案的演示。
我的目标看起来很简单。
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);
}