[英]“XMLHttpRequest Exception 101” on nested AJAX queries
我在javascript中解析我正在解析的二进制文件的AJAX。 (Quake 2 BSP,如果有人关心的话。)获取和解析初始文件的代码工作正常,看起来大致如下:
function loadFile(url) {
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState == 4 && request.status == 200) {
var parsed = parseFile(request.responseText);
}
};
request.open('GET', url, true);
request.overrideMimeType('text/plain; charset=x-user-defined');
request.setRequestHeader('Content-Type', 'text/plain');
request.send(null);
}
正如我所说,这很好,一切都正确加载和解析。 但是,该文件还描述了需要检索的几个辅助文件(纹理),因此我添加了一个内部循环,应该加载并解析所有这些文件,如下所示:
function loadFile(url) {
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState == 4 && request.status == 200) {
var parsed = parseFile(request.responseText);
for(var i = 0; i < parsed.files.length; ++i) {
loadSecondaryFile(parsed.files[i].url); // Request code here is identical to this function
}
}
};
request.open('GET', url, true);
request.overrideMimeType('text/plain; charset=x-user-defined');
request.setRequestHeader('Content-Type', 'text/plain');
request.send(null);
}
function loadSecondaryFile(url) {
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState == 4 && request.status == 200) {
var parsed = parseSecondaryFile(request.responseText);
}
};
request.open('GET', url, true);
request.overrideMimeType('text/plain; charset=x-user-defined');
request.setRequestHeader('Content-Type', 'text/plain');
request.send(null);
}
但是在该循环中发出的每个请求都会立即失败并显示消息(在Chrome中,Dev Channel): NETWORK_ERR:XMLHttpRequest异常101这让我觉得很奇怪,因为如果我在loadFile
之外调用loadSecondaryFile
它会完美地工作。
我最初的印象是,在另一个的onreadystatechage
中启动一个ajax调用可能是糟糕的juju,但在setTimer
中包装辅助ajax调用没有任何区别。
有任何想法吗?
而且......成功! 所以我觉得自己很愚蠢,现在我意识到其他任何人都无法用我提供的信息给我一个解决方案。 非常抱歉!
它与AJAX无关,而与我获取URL的方式有关。 回想一下,我提到我正在从Quake2 bsp加载二进制数据,在本例中是纹理路径。 bsp格式的纹理存储为具有空填充的固定长度32位字符串。 我正在使用substr这样阅读它们:
var path = fileBuffer.substr(fileOffset, 32);
我认为这给了我一个像“e2u3 / clip”的字符串,但实际上给了我“e2u3 / clip \\ 0 \\ 0 \\ 0 \\ 0 ......”当然,打印时这看起来是正确的(因为控制台。 log将null char表示为空。但是浏览器会立即将其识别为错误的URL并将其抛出。
将我的读取代码更改为:
var path = fileBuffer.substr(fileOffset, 32).replace(/\\0+$/,'');
给我有效的字符串并修复了我所有明显的AJAX问题! 叹
感谢所有的建议! 它帮助我走上正轨。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.