我在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);
}
Run Code Online (Sandbox Code Playgroud)
正如我所说,这很好,一切都正确加载和解析.但是,该文件还描述了需要检索的几个辅助文件(纹理),因此我添加了一个内部循环,应该加载并解析所有这些文件,如下所示:
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);
}
Run Code Online (Sandbox Code Playgroud)
但是在该循环中发出的每个请求都会立即失败并显示消息(在Chrome中,Dev Channel):NETWORK_ERR:XMLHttpRequest异常101这让我觉得奇怪,因为如果我loadSecondaryFile在外面调用loadFile它就可以完美地工作.
我最初的印象是,在onreadystatechage另一个中启动一个ajax调用可能是糟糕的juju,但在a 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问题!叹
感谢所有的建议!它帮助我走上正轨.
| 归档时间: |
|
| 查看次数: |
13766 次 |
| 最近记录: |