使用.catch()

时间:2015-12-17 14:49:27

标签: javascript angularjs angular-promise

我正在使用ngRoute进行一些基本路由。我定义了一个使用$http并将其插入resolve的服务。通常我会在服务中明确使用$q,但这次我使用内置的.then.catch,并且它不像通常那样工作。这是我所得到的简化版本:

app.config(["$routeProvider", "$locationProvider", 
    function($routeProvider, $locationProvider){
        $locationProvider.html5Mode(false);

        $routeProvider
            .when("/", {
                templateUrl: "views/index.html",
                controller: "indexCtrl",
                resolve: {
                    myData: function(myService){
                        return myService.getMyData();
                    }
                }
            })

            .otherwise({
                templateUrl: "views/404.html"
            });
    }]);

服务:

app.factory("myService", ["$http", "$route", function($http, $route){
    return {
        getMyData: function(){
            return $http.get("www.url.com")
                .then(function(data){
                    return data;
                })
                .catch(function(err){
                    return {err: "There was an error"};
                })
        }
    }
}]);

处理错误的控制器:

app.controller("errorCtrl", ["$rootScope", function($rootScope){

    $rootScope.$on("$routeChangeError", function(event, current, previous, rejection){
        console.log("err", rejection);
    })

}]);

在视图中:

<body ng-app="App" ng-controller="errorCtrl" ng-view>

问题是catch()返回的值未传递给rejection处理程序的routeChangeError参数。我通常会使用deferred.reject(data)传递数据,但我不知道为什么.catch()不能以相同的方式工作。事实上,.catch块似乎根本没有被击中。如果我进入服务并尝试破解某些内容,则会触发控制器中的routeChangeError处理程序,但不会触发catch块。只是想知道是否有人可以提供一些有关这里发生的事情的见解?

1 个答案:

答案 0 :(得分:3)

如果您return中的catch,则已处理错误,并且最终的承诺将得到满足。另请参阅Chained promises not passing on rejection

如果您想要拒绝,则需要重新throw错误(或返回被拒绝的承诺):

getMyData: function(){
    return $http.get("www.url.com")
    .catch(function(err){
        throw new Error("There was an error");
    })
}

(我还删除了无用的.then(identity)