我愿意检索资源请求的响应头,因为我已经在其中放入了分页信息而不是响应主体,以使REST api清晰。
虽然我们可以从下面的成功/错误回调中获取它:
Object.get({type:'foo'}, function(value, responseHeaders){
var headers = responseHeaders();
});
'Object'是我的资源工厂服务。
此外,当我尝试在解决所需资源后更改路线时,我尝试过这样做:
.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未定义。
如何更改$ resource服务的行为,以便将responseHeader getter抛出到$ promise then()回调函数中?
我的服务“对象”供参考:
myServices.factory('Object', ['$resource',
function($resource){
return $resource('object/:id', {id: '@id'}, {
update: {method: 'PUT'},
});
}
]);
答案 0 :(得分:9)
我遇到了完全相同的问题。我在资源定义中使用了一个拦截器来在资源中注入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');
});
答案 1 :(得分:5)
我认为我遇到了类似的问题:在发布新资源后,我需要获取响应的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
});
}
答案 2 :(得分:3)
我们不能使用#!/usr/bin/python
# -*- coding: UTF-8 -*-
'''
Application example using build() + return
==========================================
An application can be built if you return a widget on build(), or if you set
self.root.
'''
import kivy
kivy.require('1.9.1')
from kivy.app import App
from kivy.uix.button import Button
class TestApp(App):
def build(self):
# return a Button() as a root widget
return Button(text='hello world')
if __name__ == '__main__':
TestApp().run()
来返回标头,因为promise不允许多个返回值。 (例如,.then
)
这是一项请求的功能,已关闭https://github.com/angular/angular.js/issues/11056
...
(res, err)
“回调”只能有[一]个参数。原因是这些“回调”对应于同步编程的返回值/异常,并且您不能返回多个结果/从常规函数中抛出多个异常。