Получите ответный заголовок в функции then() свойства объекта $ngeResource $prom после разрешения ресурса?

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

Хотя мы можем получить его из обратного вызова успеха/ошибки, как показано ниже:

Object.get({type:'foo'}, function(value, responseHeaders){
    var headers = responseHeaders();
});

Где "Объект" - это мой ресурс factory.

Далее, когда я пытаюсь изменить маршрут после устранения необходимых ресурсов, я пробовал это:

.when('/list', {
    templateUrl: 'partials/list.html',
    controller: 'ListCtrl',

    // wait for the required promises to be resolved before controller is instantialized
    resolve: {
        objects: ['Object', '$route', function(Object, $route){
            return Object.query($route.current.params).$promise;
        }]
    }
})

и в контроллере просто вводите "объекты" вместо службы "Объект" , потому что он разрешен и заполнен реальными данными.

Но у меня возникают проблемы, когда я пытаюсь получить информацию заголовков из "объектов" в контроллере.

Я попробовал objects.$promise.then(function(data, responseHeaders){}), но responseHeader был undefined.

Как я могу изменить поведение службы $resource, чтобы он выбрал getHeader getter в функцию $prom then() callback?

Мой сервис "Объект" для справки:

myServices.factory('Object', ['$resource',
    function($resource){
        return $resource('object/:id', {id: '@id'}, {
            update: {method: 'PUT'},
        });
    }
]);

Ответ 1

У меня была такая же проблема. Я использовал перехватчик в определении ресурса для ввода заголовков http в ресурсе.

$resource('/api/resource/:id', {
    id: '@id'
  }, {
    index: {
      method: 'GET',
      isArray: true,
      interceptor: {
        response: function(response) {
          response.resource.$httpHeaders = response.headers;
          return response.resource;
        }
      }
    }});

Затем в обратном вызове then заголовки http доступны через $httpHeaders:

promise.then(function(resource) {
    resource.$httpHeaders('header-name');
});

Ответ 2

Я думаю, что у меня была аналогичная проблема: после POSTing нового ресурса мне нужно было получить заголовок Location ответа, так как Id нового ресурса был установлен на сервере, а затем возвращен через этот заголовок.

Я решил эту проблему, представив свое собственное обещание следующим образом:

app.factory('Rating', ['$resource',
    function ($resource) {

        // Use the $resource service to declare a restful client -- restangular might be a better alternative
        var Rating = $resource('http://localhost:8080/courserater/rest/ratings-cors/:id', {id: '@id'}, {
            'update': { method: 'PUT'}
        });

    return Rating;
}]);

function RestController($scope, $q, Rating) {
  var rating = new Rating();
  var defer = $q.defer(); // introduce a promise that will be resolved in the success callback
  rating.$save(function(data, headers){ // perform a POST
      // The response of the POST contains the url of the newly created resource
      var newId = headers('Location').split('/').pop();
      defer.resolve(newId)
    });
    return defer.promise;
  })
  .then (function(newId) {
    // Load the newly created resource
    return Rating.get({id: newId}).$promise; // perform GET
  })
  .then(function(rating){
    // update the newly created resource
    rating.score = 55;
    return rating.$update(); // perform PUT
  });
}

Ответ 3

Мы не можем использовать .then для возврата заголовка, потому что обещание не допускает множественные возвращаемые значения. (например, (res, err))

Это была запрошенная функция и была закрыта https://github.com/angular/angular.js/issues/11056

... then может иметь только [один] аргумент. Причиной этого является то, что эти "обратные вызовы" соответствуют возвращаемому значению/исключению из синхронного программирования, и вы не можете возвращать несколько результатов/исключать несколько исключений из регулярной функции.