HTTP-запрос отменен при предварительной загрузке аудио JavaScript в формате JavaScript - PullRequest
6 голосов
/ 05 марта 2012

Я пытаюсь предварительно загрузить аудио файлы с помощью 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 Ответ

0 голосов
/ 26 марта 2014

Я пытался сделать то же самое. Я готовил 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 мс, но отмененные запросы начали появляться снова.

Я полагаю, что клиенты на концах более медленных соединений (я на оптоволокне), вероятно, снова получат сбои, но это работает достаточно хорошо для моих целей.

...