如何使用Restangular在服务中生成应用程序错误?

时间:2015-07-18 14:22:09

标签: angularjs restangular

我正在使用AngularJS和Restangular来访问API。我有一个包装我的API调用的服务。在我的服务函数中,我想处理Restangular本机错误和应用程序逻辑错误。我应该在$ q延迟层中包装我的Restangular承诺吗?

如何捕捉(1)中产生的错误并在(2)中显示?

我的服务如下:

    app.service("project", function(Restangular) {
      var projectObj = {
        list : function() {
           ...
           return 0; 
        }, 
        generate : function() {
          var list = projectObj.list();
          if (list == 0) {
            throw 'Empty list returned'; // (1)
          }
          else {
            var promise = Restangular.one('project').get().then( function( returnedProject) {
              console.log("returned", returnedProject);
            }, function() {
              console.log('there was an error'); 
            };
            return promise; 
          }
        } 
    };
  return projectObj;
}

使用该服务的控制器:

var projectViewCtrl = function ($scope, project, notify) {
  openGenerate = function() {
    $scope.project.generate().then( function( result) {
      console.log('OK');
    }, function (error) {
      notify(error); // (2)
    });
  }
}
projectViewCtrl.$inject = [ '$scope', 'project', 'notify'];
app.controller('projectViewCtrl', projectViewCtrl);

1 个答案:

答案 0 :(得分:0)

这是要添加到您的服务中的很多代码!我认为你要找的是interceptor。您可以拦截所有呼叫并进行日志记录,而无需向所有服务添加代码。这是一个在401响应上重定向用户的示例,否则会记录到控制台:

angular.module('myApp')
  .factory('errorInterceptor', function ($q, $injector) {

    return {
      responseError: function(res) {
        if(res.status === 401) {
          $injector.get('$state').go('login');
        } else {
          console.log(res);
        }
        return $q.reject(r);
      }
    };
  }); 

您还需要在app.config

中注册拦截器
$httpProvider.interceptors.push('errorInterceptor');