嵌套AJAX查询的"XMLHttpRequest异常101"

Toj*_*oji 3 javascript ajax

我在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调用并没有任何区别.

有任何想法吗?

Toj*_*oji 7

而且......成功!所以我觉得自己很愚蠢,现在我意识到其他任何人都无法用我提供的信息给我一个解决方案.非常抱歉!

它与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问题!

感谢所有的建议!它帮助我走上正轨.