我正在对我正在用 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 Exception 101 这让我觉得很奇怪,因为如果我调用 loadSecondaryFile
在 loadFile
之外它工作得很好。
我最初的印象是,在另一个的 onreadystatechage
中启动一个 ajax 调用可能是糟糕的 juju,但是将次要的 ajax 调用包装在 setTimer
中不会任何区别。
有什么想法吗?
最佳答案
然后……成功了!所以我觉得自己真的很愚蠢,而且我现在意识到,没有其他人可以根据我提供的信息为我提供解决方案。非常抱歉!
它与 AJAX 无关,而与我获取 URL 的方式有关。回想一下我提到过我正在从 Quake2 bsp 加载二进制数据,在本例中是纹理路径。 bsp 格式的纹理存储为具有空填充的固定长度 32 位字符串。我像这样使用 substr 阅读它们:
var path = fileBuffer.substr(fileOffset, 32);
我以为是给我一个像“e2u3/clip”这样的字符串,但实际上是给我“e2u3/clip\0\0\0\0...”当然,当打印出来时这看起来是正确的(因为 console.log 将空字符表示为空。)但浏览器立即将其识别为错误 URL 并将其丢弃。
将我的读取代码更改为:
var path = fileBuffer.substr(fileOffset, 32).replace(/\0+$/,'');
给我有效的字符串并修复我所有明显的 AJAX 问题! 感叹
谢谢大家的建议!它帮助我走上了正确的道路。
关于javascript - "XMLHttpRequest Exception 101"嵌套 AJAX 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3076547/