使用带有$ resource的数据源时报告错误

时间:2014-06-03 16:15:39

标签: angularjs angular-services

我创建了一个工厂来为我的应用提供数据

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';
    });

});

问题

连接$资源成功/失败的正确方法是什么?

可能的答案

为成功和失败添加回调函数,但我不认为这是解决方案。

2 个答案:

答案 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拦截器部分。