繁体   English   中英

嵌套AJAX查询的“XMLHttpRequest异常101”

[英]“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM