ngResource с перехватчиком асинхронного ответа - PullRequest
0 голосов
/ 19 ноября 2018

Я пишу перехватчик ответов для вызова API с помощью ngResource, например:

var Thing = $resource('/api/things/:id', {id: '@id'}, {
  queryAll: {
    method: 'GET',
    interceptor: {
      response: function(response) {
        var instance = response.resource;

        doAsyncStuffHere(instance.data);

        return instance;
      }
    }
  }
});

Функция перехватчика должна обогащать данные из ответа, но возвращает неизмененный экземпляр до выполнения асинхронных операций (как и ожидалось, поскольку это асинхронный ...).

Есть ли хороший способ асинхронно обогащать данные и заставлять оператор return "ждать", пока это не будет сделано? Перезвоните? Обещай

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

После поиска правильного вопроса я нашел статью, которая решила мою проблему:

Иногда необходимо выполнить некоторые асинхронные операции внутри перехватчика. К счастью, AngularJS позволяет нам вернуть обещание, которое будет решено позже. Это будет отложить отправку запроса в случае перехватчика запроса и отложить разрешение ответа в случае перехватчика ответа.

От: http://www.webdeveasy.com/interceptors-in-angularjs-and-useful-examples/

А вот как теперь выглядит мой код и работает как шарм.

var Thing = $resource('/api/things/:id', {id: '@id'}, {
  queryAll: {
    method: 'GET',
    interceptor: {
      response: function(response) {
        var instance  = response.resource,
            _deferred = $q.defer();

        doAsyncStuffHere(instance.data).then(function() {
            _deferred.resolve(instance);
        });

        return deferred.promise;
      }
    }
  }
});
0 голосов
/ 19 ноября 2018

Использовать o пример: https://docs.angularjs.org/api/ng/service/http#$http-arguments;

Пропридада "transformRequest" - uma melhor opção;

...