Как сгенерировать ошибку приложения в сервисе с помощью Restangular?

Я использую AngularJS и Restangular для доступа к API. У меня есть служба, которая упаковывает мои вызовы API. В своих сервисных функциях я хочу обрабатывать как собственные ошибки Restangular, так и ошибки логики приложения. Должен ли я обернуть обещание Restangular в отложенный слой $q?

Как моя ошибка, сгенерированная в (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);

person GuillaumeS    schedule 18.07.2015    source источник


Ответы (1)


Это много кода для добавления к вашим услугам! Я думаю, что вы ищете перехватчик. Вы можете перехватывать все ваши звонки и вести журнал, не добавляя код ко всем своим службам. Вот пример, который перенаправляет пользователей на ответ 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');
person Andy Gaskell    schedule 18.07.2015
comment
Спасибо, это звучит очень удобно для ошибок Restangular. Из этого примера, как я могу выдать ошибку (чтобы быть пойманным перехватчиком), которая не запускается Restangular? Как и в моем примере, я проверяю, возвращается ли ответ для (синхронной) функции как 0. Если это так, я хочу получить ошибку. - person GuillaumeS; 18.07.2015