PDA

Просмотр полной версии : Последовательная обработка


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

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

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

mooncar
22.06.2010, 22:05
1.
var xData:XML = new XML();
xData.ignoreWhite = true;
xData.onLoad = function(success) {
// тут идёт обработка данных из xml-файла
nextActions();
};
xData.load("xml/files.xml");

function nextActions ()
{
//только отсюда - дальнейшие действия
}


2.
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
Всё понял, спасибо ещё раз! :)
Вопрос закрыт.