PDA

Просмотр полной версии : Алгоритмы Тайминг/последовательность выполнения и dispatchEvent


Yansan
15.01.2016, 15:50
Здравия!
Проблема вот в чём - конструктор "LableField()" заканчивает своё выполнение быстрее нежели добавляется слушатель "lableField.addEventListener(LableField.graphDataLoaded, lableFieldLoaded)" на окончание конструктора, в связи с чем "dispatchEvent(new Event(LableField.graphDataLoaded))" срабатывает слишком рано и на этом всё заканчивается, то есть функция "lableFieldLoaded(e: Event)" никогда не сработает.
Я что-то упускаю из виду, но что? Прошу подсказать, если не ответ, то хотя бы путь где поискать, а пока штудирую справочники :(

package {
import flash.display.Sprite;
import tp.*;
import flash.events.Event;

public class TestProj extends Sprite {
private var graphConteiner: Sprite;

public function TestProj() {
trace ("TestProj Создание основного контейнера отображения");
graphConteiner = new Sprite();

trace ("TestProj Запуск конструктора LableField()");
var lableField = new LableField();

trace ("TestProj Добавление слушателя addEventListener(LableField.graphDataLoaded, lableFieldLoaded)");
lableField.addEventListener(LableField.graphDataLoaded, lableFieldLoaded);

function lableFieldLoaded(e: Event): void {

trace("TestProj Присвоение переменной данных из LableField");
var lableContData = lableField.getContainerLableField();

trace("TestProj Добавление в контейнер непосредственного отображения");
if (graphConteiner.contains(lableContData)==false) graphConteiner.addChild(lableContData);

trace("TestProj Добавление на экран основного контейнера отображения");
addChild(graphConteiner);
}
}
}
}

package tp {
import flash.events.EventDispatcher;
import flash.events.Event;
import flash.display.Sprite;
import flash.text.TextField;

public class LableField extends EventDispatcher {
public static const graphDataLoaded: String = "graphDataLoaded";
private var labContainer: Sprite; //контейнер для хранения лэйблов

public function LableField() {
labContainer = new Sprite();

var Lable001: TextField = new TextField();
Lable001.x = 10;
Lable001.y = 10;
Lable001.text = "Если это видно на экране, значит всё работает как надо.";

trace ("LableField Добавление данных в группу labContainer");
labContainer.addChild(Lable001);

trace ("LableField Запуск dispatchEvent(new Event(LableField.graphDataLoaded))");
dispatchEvent(new Event(LableField.graphDataLoaded));
}

public function getContainerLableField() {
return (labContainer);
}
}
}

Wolsh
15.01.2016, 20:09
Ну, Вы подписываетесь на событие после того, как оно отправлено. А вопрос-то в чем?
Нет никакого вообще смысла отправлять какие-то события из конструктора. Потому что пока работает конструктор, нет его результата — объекта, с которым может что-то случиться) Некому посылать событие и нельзя подписаться на событие от объекта, которого еще нет. Это абракадабра.

У меня вот есть вопрос — Вам зачем тут событие вообще, о чем оно? Код итак исполняется синхронно, и само собой, что на строку, следующую после new ..() вы перейдете только после того, как конструктор полностью отработает. То есть можете смело считать, что свое "событие" вы уже получили.

Yansan
15.01.2016, 23:12
Да, Вы правы. Странная у меня получилась логика. В данном примере EventDispatcher вообще не нужен. Я как-то совсем упустил что пока new ... () не закончит своё действие, выполнение дальше не пойдёт. Значит проблема у меня в чём-то другом.

Спасибо за ответ.
Тут всё, пошёл искать проблемы в других местах.