HTTP-запрос отменен при предварительной загрузке аудио javascript html5
Я пытаюсь предварительно загрузить аудио файлы с помощью JavaScript. Я использую Chrome, когда число файлов растет, запрос http моих файлов отменяется chrome... почему? Что я могу сделать? Это мой код:
filesToLoad = 44;
filesLoaded = 0;
for ( var ni = 1; ni < filesToLoad; ni++) {
console.log("start::: " + ServerPath + 'audio/' + ni + '.mp3');
loadAudio(ServerPath + 'audio/' + ni + '.mp3');
}
function loadAudio(uri) {
var audio = new Audio();
audio.addEventListener('canplaythrough', isAppLoaded, true); // It
audio.src = uri;
return audio;
}
function isAppLoaded() {
filesLoaded++;
if (filesLoaded >= filesToLoad) {
cb();
}
console.log("load::: " + ServerPath + 'audio/' + filesLoaded + '.mp3');
}
function cb() {
alert("loaded");
}
1 ответ
Я пытался сделать то же самое. Я предварительно загружал 12 аудио и 12 графических файлов в рамках подготовки к интерактивным действиям на их основе. Я получал ту же проблему (запросы отменены).
Я собрал эту процедуру, которая работает для меня (тестирование Chrome уже сделано).
cacheLessonFiles: function (lessonWords, cacheImg, cacheAudio) {
var
fileName = '',
img = {},
audio = {},
wordIDs = Object.keys(lessonWords)
;
wordIDs.forEach(function (wordID) {
if (cacheImg) {
fileName = lessonWords[wordID].img || wordID;
img = new Image();
img.onload = function () {
console.log('cache: finished caching ' + this.src);
};
img.src = "/img/" + fileName + imageSuffix;
}
if (cacheAudio) {
fileName = lessonWords[wordID].saySpanish || wordID;
audio = new Audio();
audio.onloadeddata = function () {
console.log('cache: finished caching ' + this.src);
};
audioArray.push({a: audio, f:"/audio/" + fileName + audioSuffix});
}
});
setTimeout(loadAudio, AUDIO_LOAD_WAIT);
},
Процедура просто загружает файлы изображений без специальной обработки. Файлы изображений были сложнее. Вместо того, чтобы просто установить источник для всех аудиофайлов в цикле, я заполнил массив аудиоэлементом и соответствующим именем исходного файла (.mp3). Затем я запустил самопроизвольный обратный вызов через тайм-аут для обработки массива с паузой в 200 мс между запросами.
function loadAudio () {
var
aud = audioArray.pop()
;
aud.a.src = aud.f;
if (audioArray.length > 0) {
setTimeout(loadAudio, AUDIO_LOAD_WAIT);
}
}
Одна константа и одна переменная находятся внутри замыкания, но вне метода cacheLessonFiles().
AUDIO_LOAD_WAIT = 200,
audioArray = []
Я пробовал время ожидания менее 200 мс, но отмененные запросы начали появляться снова.
Я полагаю, что клиенты на концах более медленных соединений (я на оптоволокне), вероятно, снова получат сбои, но это работает достаточно хорошо для моих целей.