Get response header in then() function of a ngResource object's $promise property after resource resolved? Get response header in then() function of a ngResource object's $promise property after resource resolved? angularjs angularjs

Get response header in then() function of a ngResource object's $promise property after resource resolved?


I had the exact same problem. I used an interceptor in the resource definition to inject the http headers in the resource.

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

Then, in the then callback, the http headers are accesible through $httpHeaders:

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


I think I had a similar problem: After POSTing a new resource I needed to get the Location header of the response, since the Id of the new resource was set on the server and then returned via this header.

I solved this problem by introducing my own promise like this:

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  });}


We can't use .then for returning the header because the promise doesn't allow for multiple return values. (e.g., (res, err))

This was a requested feature, and was closed https://github.com/angular/angular.js/issues/11056

... the then "callbacks" can have only [one] argument. The reason for this is that those "callbacks" correspond to the return value / exception from synchronous programming and you can't return multiple results / throw multiple exceptions from a regular function.