Javascript &引用;XMLHttpRequest异常101“;关于嵌套AJAX查询

Javascript &引用;XMLHttpRequest异常101“;关于嵌套AJAX查询,javascript,ajax,Javascript,Ajax,我正在用javascript对正在解析的二进制文件进行AJAX获取。(如果有人关心的话,请参阅Quake 2 BSP。)获取和解析初始文件的代码工作正常,大致如下所示: function loadFile(url) { var request = new XMLHttpRequest(); request.onreadystatechange = function () { if (request.readyState == 4 && reque

我正在用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);
}
函数加载文件(url){
var request=new XMLHttpRequest();
request.onreadystatechange=函数(){
if(request.readyState==4&&request.status==200){
var parsed=parseFile(request.responseText);
对于(var i=0;i
但是,从该循环中发出的每个请求都会立即失败,并显示以下消息(在Chrome中,开发频道):NETWORK\u ERR:XMLHttpRequest Exception 101这让我觉得很奇怪,因为如果我在
loadFile
之外调用
loadSecondaryFile
,它会工作得很好

我最初的印象是,在另一个的
onreadystatechage
中启动一个ajax调用可能是不好的jujuju,但是在
setTimer
中包装辅助ajax调用没有任何区别


有什么想法吗?

还有。。。成功!所以我觉得自己真的很愚蠢,现在我意识到,其他人不可能用我提供的信息给我一个解决方案。非常抱歉

它与AJAX无关,而与我如何获取URL有关。回想一下,我提到我正在从地震2 bsp加载二进制数据,在本例中是纹理路径。bsp格式的纹理存储为固定长度的32位字符串,填充为空。我正在使用substr阅读它们,如下所示:

var path=fileBuffer.substr(fileOffset,32)

我以为这会给我一个像“e2u3/clip”这样的字符串,但实际上是给我“e2u3/clip\0\0\0\0…”当然,当打印出来时,这看起来是正确的(因为console.log将空字符表示为nothing)。但是浏览器立即将其识别为错误的URL并将其抛出

将我的读取代码更改为:

var path=fileBuffer.substr(fileOffset,32)。替换(/\0+$/,“”)

给了我有效的字符串并修复了所有明显的AJAX问题!叹息


谢谢你的建议!它帮助我走上了正确的道路。

你能展示一下
loadSecondaryFile
函数吗?正如我在问题中提到的,请求部分与loadFile相同,但我还是会发布它以避免混淆。对于(var I=0;Iparsed.files[i]。url
是否是有效的请求url?