Использование URLLoader.load внутри цикла for


Я создаю веб-сайт с помощью Adobe Flash Professional CS5.
Я пытаюсь прочитать содержимое текстового файла с помощью URLLoader.load(path) внутри цикла for.
Путь меняется при каждой итерации. .
Когда я отслеживаю данные из метода обработчика событий, он возвращает только содержимое текстового файла последнего пути.
Кажется, что он вызывает метод обработчика событий только после того, как for завершил цикл.

КОД:

var myData:URLLoader = new URLLoader();

myData.addEventListener(Event.COMPLETE, onLoaded);

function onLoaded(e:Event):void
{
trace(myData.data);
}

for (var o = 0; o < filesArray.length; o++)
{
    for (var p = 0; p < filesArray[o].length; p++)
    {
        if (filesArray[o][p] == "category.txt")
        {
            path = "C:\\inetpub\\wwwroot\\" + filesArray[o][0] + "\\" + filesArray[o][p];
            myData.load(new URLRequest(path));
            trace(path);
        }
    }
}

Это результат:

C:\inetpub\wwwroot\0001\category.txt
C:\inetpub\wwwroot\0002\category.txt
C:\inetpub\wwwroot\0003\category.txt
C:\inetpub\ wwwroot\0004\category.txt
C:\inetpub\wwwroot\0005\category.txt
Ювелирные изделия

Как я уже сказал, «Ювелирные изделия» — это содержимое «C:\inetpub\wwwroot\0005\category.txt».

Я попытался изменить метод onLoaded, чтобы он возвращал такую ​​строку:

function onLoaded(e:Event):String
{
    return myData.data.toString();
}

Это внутри цикла for:

trace(myData.load(new URLRequest(path)));

Затем я получил это как мой вывод:

undefined
C:\inetpub\wwwroot\0001\category.txt
undefined
C:\inetpub\wwwroot\0002\category.txt
undefined
C:\inetpub\wwwroot\0003 \category.txt
не определено
C:\inetpub\wwwroot\0004\category.txt
не определено
C:\inetpub\wwwroot\0005\category.txt

Я также пытался преобразовать цикл for в цикл while, результат тот же.
Почему он так себя ведет?
Если метод URLLoader.load не работает внутри цикла for, и я ничего не могу с этим поделать , есть ли другой способ читать простой текст из файлов, например FileStream или что-то в этом роде? (Я новичок в ActionScript, с C#)

Заранее спасибо,
Фредди.


person Community    schedule 23.04.2011    source источник


Ответы (2)


Вы не даете загрузчику достаточно времени для загрузки текстовых файлов. Ваш компьютер намного быстрее, чем скорость сети, поэтому, вероятно, еще до того, как загрузчик начнет загружать первый файл, он вынужден загрузить второй, а затем следующий и так далее. И последний - единственный, который успевает загрузиться.

Вы должны подождать, пока каждый из них действительно не завершит загрузку, прежде чем начинать следующий. Это не будет работать в цикле, вам нужно поместить имя в массив, затем настроить в нем индекс, инициализировать первый элемент, начать загрузку, затем в событии onLoaded получить файл, увеличить индекс и перейти к загрузке следующего текстовый файл, пока не закончите.

И да, вы можете использовать только один загрузчик для всех ваших файлов. Решение с несколькими загрузчиками также будет работать, но не потому, что вы просто используете несколько загрузчиков, а опять же потому, что каждый из них не будет прерываться другим.

person Tomasz Stanczak    schedule 23.04.2011
comment
Теперь это действительно имеет смысл. :D Теперь я понимаю, почему я получил только содержимое последнего пути, хотя загрузчик создает новый экземпляр URLLoader на каждой итерации. Спасибо, что прояснили ситуацию ;) Я попытаюсь это сделать, я предполагаю, что это решит другую проблему, которая у меня сейчас есть. Команды после цикла for (который вызывает функцию загрузчика) выполняются до завершения события. Вероятно, из-за той проблемы со временем, которую вы упомянули. ЕЩЕ РАЗ СПАСИБО! - person ; 23.04.2011

В этом руководстве и примере кода рассматривается предварительная загрузка в несколько файлов http://manewc.com/2008/09/02/preloading-multiple-image-demo/

Проблема с вашим кодом может заключаться в том, что у вас есть только один URLLoader для всех файлов. Вам нужно создать новый объект загрузки для каждого файла.

person Thomas Brasington    schedule 23.04.2011
comment
Спасибо! Я создал новый метод, который получает путь, создает новый экземпляр URLLoader и загружает оттуда текстовый файл. ОНО РАБОТАЕТ! :) - person ; 23.04.2011