我正在使用 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"};
})
}
}
}]);
以及处理错误的 Controller :
app.controller("errorCtrl", ["$rootScope", function($rootScope){
$rootScope.$on("$routeChangeError", function(event, current, previous, rejection){
console.log("err", rejection);
})
}]);
在 View 中:
<body ng-app="App" ng-controller="errorCtrl" ng-view>
问题是 catch()
返回的值没有传递给 routeChangeError
处理程序的 rejection
参数。我通常会使用 deferred.reject(data)
传递数据,但我不知道为什么 .catch()
的工作方式不同。事实上,.catch
block 似乎根本没有受到攻击。如果我进入服务并尝试破坏某些东西,这会触发 Controller 中的 routeChangeError
处理程序,但不会触发 catch
block 。只是想知道是否有人可以提供一些关于这里发生的事情的见解?
最佳答案
如果您从 catch
中返回
,则您已经处理了 错误,并且生成的 promise 将得到实现。另见 Chained promises not passing on rejection .
如果你想要拒绝,你将需要重新抛出
一个错误(或返回一个被拒绝的 promise ):
getMyData: function(){
return $http.get("www.url.com")
.catch(function(err){
throw new Error("There was an error");
})
}
(我也删除了无用的.then(identity)
)
关于javascript - 使用 .catch() 处理 $routeChangeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34337429/