$ q.reject和AngularJS链接承诺中的处理错误

时间:2015-03-20 20:39:51

标签: javascript angularjs promise chaining

我无法理解链接承诺的错误处理的基本概念。 为了学习规则,我写了一个简单的例子,猜测结果是什么。但不幸的是,它不会像我一样表现。 我读了很多关于这个主题的文章,但由于我的英语不好,我可能无法得到细节。

无论如何,这是我的代码:

    var promiseStart = $q.when("start");
    var promise1 = promiseStart.then(function() {
            return Serviceforpromise1.get();
    });
    var promise2 = promise1.then(function(data1)
    {
            return Serviceforpromise2.get(data1);
    },function(error)
    {
            return $q.reject();
    });
    var promiseend = promise2.then(function(data2)
    {
            return data2;
    },function(error)
    {
            return error;
    });
    return promiseend;

我知道它可以更好地编码,但它只是为了这个目的。 以下是Serviceforpromise1函数的代码:

    function Serviceforpromise1()
    {
            ...
            return $http.get(*whatever*).then(function (data){
                return data;
            },function(error)
            {
                return $q.reject();
            });
    }

仅考虑Serviceforpromise1失败的情况。 $ q.rejec t被发送回主链,所以我正在等待“ promise1 .then(”)的错误回调被调用,并且它按预期工作。我决定将该错误转移到“ promise2 .then ”,因此在此错误回调中我添加了行 return $ q.reject(); 但它从未达到第二个错误回调(“ promise2 .then ”一个),我不明白为什么(就像Serviceforpromise1,我返回了一个被拒绝的承诺!)

我很乐意深入了解这里发生的事情。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:7)

你的理解是正确的,问题似乎在于你试图观察这种行为的某种方式(在你没有向我们展示过的东西中)。

如果您在then()中从 成功或错误处理程序返回被拒绝的承诺,则then()返回的承诺将解析为被拒绝的承诺。观察:

angular.module('app', [])
    .controller('C', [
    '$q',

function ($q) {
    var promiseStart = $q.when("start");
    var promise1 = promiseStart.then(function (value) {
        console.log('Got a value:', value);
        return $q.reject('Error!');
    });

    var promise2 = promise1.then(function (data1) {
        return "Got some stuff";
    }, function (error) {
        console.log("Caught an error:", error);
        return $q.reject('New error');
    });

    var promiseend = promise2.then(function (data2) {
        return data2;
    }, function (error) {
        console.log('Caught an error:', error);  // <-- this is logged to the console
        return error;
    });

    return promiseend;
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.10/angular.min.js"></script>
<div ng-app='app' ng-controller='C'></div>

这里需要注意的一点是,在最后一个处理程序中,您返回 error变量,而不是抛出异常或返回被拒绝的承诺。因此,在这种情况下,promiseend成功解析该error变量的值。