我使用$ http将数据发布到服务器。
在发出POST请求之前,有两个OPTIONS requestMethod调用。
但是,有时不会发出POST请求。
当我在返回此呼叫时更新html时,页面会挂起。
$http({
url: scope.Settings.url,
method: "POST",
data:data,
withCredentials: true
}).then(function (data, status, headers, config) {
setBusyState(false);
scope.rModel = scope.search;
scope.Results = data.data;
}, function (data, status, headers, config) {
scope.Results = [];
setBusyState(false);
});
编辑:这不会永远发生。只有几次。
这似乎只发生在Chrome中,而在IE中则很好
答案 0 :(得分:1)
这是AngularJS的一个已知问题,它会缓存后续的http请求,所以如果你有多个http请求排成一行,你有时会遇到一些调用实际上没有。我主要看到这个积极缓存的问题IE。
要解决此问题,您需要应用某种全局设置,以防止http请求被缓存。以角度为单位的理想位置是$httpProvider
。
基本上,您使用适当的值设置不同的标头参数。
来自app.config的相关代码
appConfig.config(['$httpProvider', function ($httpProvider) {
$httpProvider.defaults.cache = false;
//initialize get if not there
if (!$httpProvider.defaults.headers.get) {
$httpProvider.defaults.headers.get = {};
}
//disable IE ajax request caching
$httpProvider.defaults.headers.get['If-Modified-Since'] = <set a time>;
$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}
]);
答案 1 :(得分:0)
chrome中有什么角度,它会产生OPTIONS请求。
这些飞行前OPTIONS请求是在发出实际请求之前询问实际请求权限的一种方式。
因此,作为一种解决方法,在请求中添加标题可以解决问题。
$http({
url: scope.Settings.url,
method: "POST",
data: data,
headers: {
'Content-Type': 'application/json'
},
withCredentials: true
}).then(function(data, status, headers, config) {
setBusyState(false);
scope.rModel = scope.search;
scope.Results = data.data;
}, function(data, status, headers, config) {
scope.Results = [];
setBusyState(false);
});