Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Последовательная обработка (http://www.flasher.ru/forum/showthread.php?t=141361)

Бармалейкин 22.06.2010 22:00

Последовательная обработка
 
Как на AS 2.0 сделать последовательную обработку событий? А именно:
1. у меня грузится некоторый xml-файл с данными
2. на основании того, что внутри этого файла, грузятся ещё объекты
Так вот столкнулся с тем, что данные из xml ещё не загрузились а скрипт уже перешёл к выполнению следующих команд. В итоге данных ещё нет, и вылезает ошибка. Разумеется, если грузить эти данные локально, то грузятся они быстро и всё проходит. Код простейший:

Код AS1/AS2:

var xData:XML = new XML();
xData.ignoreWhite = true;
xData.onLoad = function(success) {
        trace("Load ok!");
// тут идёт обработка данных из xml-файла
};
xData.load("xml/files.xml");

Пытался сделать ожидание загрузки, ставил после xData.load() цикл
Код AS1/AS2:

while (!xData.loaded) { }

но он просто завесил браузер, после чего плеер запросил останов скрипта. Как я понял, во Flash нет никакой паузы/задержки а только setInterval. :(
Как лучше поступить? Как вообще строить код, который должен дожидаться окончания загрузки, прежде чем исполняться дальше? Помогите пожалуйста!

mooncar 22.06.2010 22:05

1.
Код AS1/AS2:

var xData:XML = new XML();
xData.ignoreWhite = true;
xData.onLoad = function(success) {
        // тут идёт обработка данных из xml-файла
        nextActions();
};
xData.load("xml/files.xml");
 
function nextActions ()
{
        //только отсюда - дальнейшие действия
}

2.
Код AS1/AS2:

var xData:XML = new XML();
xData.ignoreWhite = true;
xData.onLoad = function(success) {
        // тут идёт обработка данных из xml-файла
        xmlDataReady = true ;
};
xData.load("xml/files.xml");
 
 
var chk:Number = setInterval(checkXmlData, 100);
 
function checkXmlData()
{
        if (xmlDataReady)
        {
                clearInterval(chk);
                //только отсюда - дальнейшие действия
        }
}

PS. Пауза / задержка во флеше есть, это функция setTimeout, только вы ее не должны использовать, вам нужна не пауза, а отслеживание загрузки данных.

Бармалейкин 22.06.2010 22:31

т.е. получается нужно каждый блок кода заключать в функцию, и её вызывать из .onLoad предыдущего блока кода? Эдакая цепочка... Но в целом суть понял, спасибо!
А setTimeout это таймер, он не остановит выполнения кода, просто вызовет (паралельно?) по истечении заданного времени заданную функцию. Не подходит.

Ещё тогда такой вопросик - а .load для нескольких разных объектов выполняется паралельно или есть наподобие очереди, например не более 4 одновременно загружаемых объектов?

mooncar 22.06.2010 23:14

Насчет XML не знаю. Но например, когда грузим MovieClipLoder.load, замечал, всё происходит безо всякой очереди, причем последнее, вызванное к загрузке, обычно загружается первым.
Так что и здесь скорее всего так.
Цитата:

Эдакая цепочка.
Конечно. AS работает асинхронно, поэтому только так.
Используются слушатели, обработчики событий и от это "танцуются" все остальные действия.

Бармалейкин 22.06.2010 23:42

Всё понял, спасибо ещё раз! :)
Вопрос закрыт.


Часовой пояс GMT +4, время: 19:12.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.