Я делаю 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
не имеет никакого значения.
Есть идеи?