为什么在Angular中链接`then`会导致荒谬的结果?

时间:2016-09-16 11:33:00

标签: angularjs angular-promise

进行以下两项测试。第一次测试: -

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/

1 个答案:

答案 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');