0

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

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

});

问题

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

可能的答案

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

4

2 回答 2

1

首先要考虑的是你为什么要改成$resource? 该$resource服务应该提供一个伪对象-REST 映射。这样您就可以获取对象和对象集合,您可能希望对其进行修改并再次保存。如果您只想拥有一个检索错误集合的服务,那么继续使用它可能会更简单$http

其次,使用方法$resource是在您的服务工厂函数中调用它一次,以创建一个具体的“类型化/绑定”资源对象,然后您将其作为服务返回:

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);
};
于 2014-06-04T11:04:43.877 回答
-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);
    }
  };
});

文档可以在这里找到。在 http 拦截器部分。

于 2014-06-03T17:29:43.720 回答