我的公司开发了一个嵌入式 JavaScript 视频播放器。引导过程的一部分涉及使用 XMLHttpRequest
从我们的服务器获取资源。这是一个跨域请求,因为我们的视频播放器通过脚本标签嵌入到其他人的网站上。我们已正确配置 CORS header ,并且它可以在 Chrome、Firefox、Safari、iOS、Android 和其他浏览器中运行。当我在 IE 11 和 10 中测试时,它也适用于我。
但是,根据我们的分析数据,我们发现在 IE 11 中,xhr
对象引发 error
事件的概率约为 10%。我无法我自己重现了这个问题。
有人能想到为什么会发生这种情况吗?我所拥有的最好的理论是某种企业 IE 安全设置阻止了我们的跨源请求。但这只是疯狂的猜测。
有其他人经历过类似的事情并找到原因吗?
这是我为发出请求而编写的代码。我不相信我做错了什么。
function makeRequest(config) {
var xhr = new window.XMLHttpRequest();
var deferred = q.defer();
var url;
function setHeaders(headers) {
var header;
for (header in headers) {
xhr.setRequestHeader(header, headers[header]);
}
}
// toQueryParams() converts an object to URL query params
url = config.url + toQueryParams(config.params);
/*
* This function gets called when the XHR is "loaded". It then fulfills or rejects
* the promise based on the HTTP status code of the response.
*/
function handleResponse() {
var response = {
status: xhr.status,
data: (function() {
try {
return JSON.parse(xhr.responseText);
} catch(e) {
return xhr.responseText;
}
}()),
headers: function() {
return xhr.getAllResponseHeaders();
}
};
var status = response.status,
var success = !(status >= 400 && status < 600);
deferred[success ? 'resolve' : 'reject'](response);
}
/*
* This function gets called when the XHR emits an "error".
*
* There is code elsewhere that sends these errors to our Google Analytics
* account. This is how we know about the IE 11 XHR errors even though I
* can't reproduce them.
*/
function handleError() {
deferred.reject({
status: null,
data: new Error('The XHR request to [' + url + '] has failed...'),
headers: function() {
return null;
}
});
}
xhr.onload = handleResponse;
xhr.onerror = handleError;
xhr.open(config.method, url, true);
xhr.responseType = config.responseType || '';
setHeaders(config.headers);
xhr.timeout = config.timeout || 0;
xhr.send(config.data);
return deferred.promise;
}
感谢您提供的任何帮助!
最佳答案
不确定这是否仍然相关,但您的问题听起来很可疑 - this
我也面临同样的问题。就我而言,当 IE 中止请求并且请求未到达服务器时,就会发生这种情况。在本例中,xhr.status 为 0,响应为空,因此解析 JSON 将引发异常。
我找不到对此问题的万无一失的修复方法,但我的解决方法是,如果响应与 IE 中止场景匹配,则在错误 block 中使用相同的参数/有效负载重试调用几次。
干杯!
关于javascript - IE 11 XHR 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28503282/