javascript - "XMLHttpRequest Exception 101"嵌套 AJAX 查询

标签 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);
}

正如我所说,它工作正常,一切都正确加载和解析。但是,该文件还描述了几个也需要检索的辅助文件(纹理),因此我添加了一个内部循环来加载和解析所有这些文件,如下所示:

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/

相关文章:

javascript - 如何在给定时间内重新加载ajax调用函数

javascript - 优化/加速 AngularJS HTML 渲染 - 性能问题

javascript - 在javascript中,如何反转 Canvas 的y轴?

javascript - 拆分 JSON 响应并使用图表数据

php - 使用 AJAX 重新加载验证码

ruby-on-rails - 服务端推送 Rails

javascript - 调用嵌套函数 onClick 事件不识别嵌套函数

javascript - 将值从弹出窗口 ('open' ) 发送到 'popupbeforeposition'

javascript - 使用 Laravel 在服务器上上传声音 Blob

javascript - 如何在ajax中引入点击事件