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

Pat*_*one 6 javascript chaining promise angularjs

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

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

    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;
Run Code Online (Sandbox Code Playgroud)

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

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

仅考虑Serviceforpromise1失败的情况.一个$ q.rejec t被送回主链上,所以我在等待的"错误回调promise1.然后( "被称为和它的工作如预期,我决定为例子错误transfert到" promise2.然后 "所以在这个错误回调我添加了行返回$ q.reject() ;但它从未达到第二个错误回调(" promise2 .then "一个)我不明白为什么(像Serviceforpromise1,我返回了一个拒绝承诺!)

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

JLR*_*she 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;
}]);
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.10/angular.min.js"></script>
<div ng-app='app' ng-controller='C'></div>
Run Code Online (Sandbox Code Playgroud)

这里有一点要注意的是,在这最后的处理程序,你回来error变量,而不是抛出异常或返回被拒绝的承诺.所以在这种情况下,promiseend成功解析该error变量的值.