进行以下两项测试。第一次测试: -
var d = $q.defer();
d.promise.then(null, null)
.then(function () {
console.log('success');
}, function () {
console.log('fail');
});
d.reject(); // Prints fail, as expected
第二次测试: -
var d = $q.defer();
d.promise.then(null, function () {}) // Notice second argument is not null
.then(function () {
console.log('success');
}, function () {
console.log('fail');
});
d.reject(); // Prints success!
为什么在第二次测试中我得到'成功'的消息?
JSFiddle - https://jsfiddle.net/7agszh95/
答案 0 :(得分:4)
在第二种情况下,您在第一次调用.then()
时传入了失败处理程序。假定该函数已处理错误,因此无论它返回什么,都会传递给链中下一个promise的成功处理程序(除非它返回一个promise,然后链中的下一个promise将获得解析或拒绝的结果)返回的承诺)。
如果您想要一个失败处理程序但不希望它将问题标记为已解决,则需要返回一个指示进一步失败的值。 return $q.reject()
是最简单的方法,尽管您可能还想传播实际错误:
var d = $q.defer();
d.promise.then(null, function (err) {
return $q.reject(err); // Indicate that we didn't manage to handle the error
})
.then(function () {
console.log('success');
}, function (err) {
console.log('fail: '+err);
});
d.reject('some error');