我正在使用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
块。只是想知道是否有人可以提供一些有关这里发生的事情的见解?
答案 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)
)