我创建了一个工厂来为我的应用提供数据
myApp.factory('dataRepository', function ($resource) {
return {
getApplicationErrors: function (applicationName) {
return $resource('/api/DataSource/GetApplicationErrors').query();
},
}
我已使用$ http,$ q更改了我的数据访问权限以使用$ resource到:
旧实施
var deffered = $q.defer();
$http.get('/api/DataSource/GetApplicationErrors').success(deffered.resolve).error(deffered.reject);
return deffered.promise;
新实施
$scope.exceptions = dataRepository.getApplicationErrors($routeParams.applicationName);
现在如果在获取数据时出错,我想显示错误。
所以当我有旧的实现时,我有两个回调挂钩,现在我不知道如何实现它。我的想法是:
myApp.controller("ErrorListController",
function ErrorListController($scope, dataRepository) {
dataRepository.getApplicationErrors('test')
.$promise
.then(function (data) {
$scope.exceptions = data;
}, function(error) {
$scope.errorMessage = 'Failed to load data from server';
});
});
问题
连接$资源成功/失败的正确方法是什么?
可能的答案
为成功和失败添加回调函数,但我不认为这是解决方案。
答案 0 :(得分:1)
首先要考虑的是为什么要更改为$resource
? $resource
服务应该提供伪对象REST映射。这样您就可以获取对象和对象集合,您可能希望修改这些对象和集合并再次保存。如果你想拥有一个可以检索错误集合的服务,那么继续使用$http
可能会更简单。
其次,使用$resource
的方法是在服务工厂函数中调用它一次,以创建一个具体的" typed / bound"资源对象,然后将其作为服务返回:
myApp.factory('dataRepository', function ($resource) {
return {
getApplicationErrors: $resource('/api/DataSource/GetApplicationErrors')
};
}
在您的控制器中,您可以注入此内容以访问资源方法。 query
的第一个参数是params
对象,它基本上直接传递给$http
。所以你可以在那里做点什么......
myApp.controller("ErrorListController",
function ErrorListController($scope, dataRepository) {
$scope.errors = dataRepository.getApplicationErrors.query({ params: { appName: 'test' });
};
这将立即向$scope.errors
属性添加一个空数组。当响应到达时,资源将使用结果填充此数组。
如果要捕获错误,则可以在返回的对象上使用$promise
属性。这使您可以访问正在使用的原始$http
承诺:
myApp.controller("ErrorListController",
function ErrorListController($scope, dataRepository) {
$scope.errors = dataRepository.getApplicationErrors.query({ params: { appName: 'test' });
$scope.errors.$promise.then(success, error);
};
答案 1 :(得分:-1)
Http拦截器可能是包装所有响应错误的最佳选择。它本质上是一种通过angular包装所有http调用的方法。你会想做这样的事情:
.config(function($httpProvider) {
$httpProvider.interceptors.push('MyInterceptor');
})
.service('MyInterceptor', function($q, $injector) {
return {
responseError: function(error) {
// Maybe you want to persist to database?
$http = $injector.get('$http');
$http.post('/log/my/error', error);
//... Notify the user of the error here or add logic to dynamically propagate to the user
alert("ERROR: " + error);
// continue promise chain
$q.reject(error);
}
};
});
可以找到文档here。在http拦截器部分。