«Исключение XMLHttpRequest 101» для вложенных запросов AJAX - PullRequest
3 голосов
/ 19 июня 2010

Я делаю AJAX-выборку двоичного файла, который я анализирую в javascript. (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 работает отлично.

Мое первоначальное впечатление заключалось в том, что инициирование одного вызова ajax в onreadystatechage другого может быть плохим джиу, но перенос вторичных вызовов ajax в setTimer не имеет никакого значения.

Есть идеи?

1 Ответ

7 голосов
/ 21 июня 2010

И ... УСПЕХ! Поэтому я чувствую себя по-настоящему глупо, и теперь я понимаю, что никто другой не мог бы дать мне решение с помощью информации, которую я представил. Ужасно извините!

Это не имеет ничего общего с 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! Вздох

Спасибо за все предложения! Это помогло мне встать на правильный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...