Перехватчики ресурсов AngularJS $

Как добавить перехватчики к вызову $resource?

Скажем, у меня есть ресурс factory, называемый Users, например:

app.factory('Users', ['$resource', 'resourceInterceptor',
  function ($resource, resourceInterceptor) {
    return $resource(
      'users/:user_id',
      {
        user_id: '@id'
      },
      {
        query: {
          method: 'GET', // Not changing the default method, just adding an interceptor
          interceptor: resourceInterceptor // Is there any better way to do this.. like globally?
        },
        save: {
          method: 'POST', // Same here
          interceptor: resourceInterceptor // Again...
        },
        ..., // And so on
      }
    );
  }]);

и моя служба resourceInterceptor выглядит следующим образом:

app.factory('resourceInterceptor', ['$rootScope',
  function ($rootScope) {
    return {
      request: function () {
        // This function isn't executed at all?
        $rootScope.loading = true;
      },
      response: function () {
        $rootScope.loading = false;
      },
      responseError: function () {
        $rootScope.loading = false;
      }
    };
  }]);

Прежде всего, функция перехвата request никогда не выполняется, почему бы и нет?

Во-вторых, необходимость жесткого кодирования перехватчика в существующих методах $resource очень утомительна, есть ли способ упростить назначение перехватчиков определенным вызовам $resource или, возможно, даже назначить перехватчик для всех вызовов $resource?

Ответы

Ответ 1

Чтобы использовать перехватчик в ресурсе, вы должны:

1 - Сделать httpInterceptor с запросом, ответом, responseError:

app.factory('myInterceptor', function () {
    //Code
    //return { request:...,
});

2 - настройте этот перехватчик в своем приложении:

app.config(['$httpProvider', function ($httpProvider) {
    $httpProvider.interceptors.push('myInterceptor');
}]);

Прямо сейчас, когда у вас есть конфиг, у вашего httpProvider есть перехватчик, куда бы вы ни вводили $http, вы будете использовать этого провайдера, так что... вы исключите ваш запрос, ответ и функцию ответа на вызов.

3 - Использование его в ресурсе. Поскольку $resource использует $http, и у вас есть настройка httpProvider globaly, вы будете называть функцию перехватчиков при использовании своего ресурса.

Второй вопрос: Вы не можете установить перехватчик для конкретного объекта $http, они (перехватчики) установлены глобально.

(Даже если вы установите перехватчик перед определением вашего модуля, а затем удалите его, вы не сможете узнать порядок выполнения)

Что вы можете сделать, если не хотите переопределять свойство перехватчика в каждом действии $resource (как вы пишете в своем вопросе), вы можете улучшить свой перехватчик.

app.factory('userLoadingInterceptor', function () {
    //Code
    return {
        request: function(){
            //Check if your are working with a url related with users
            // and if so do things...
        }
});

Ответ 2

Из документов:

Объект перехватчика имеет два необязательных метода - response и responseError

Я не знаю, чего вы хотите достичь, но альтернативными могут быть общие HTTP-перехватчики.