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