2010-10-18 11 views
5

Staram się dowiedzieć, czy zdarzenia są obsługiwane w kolejności ich wysyłania. Powiedzmy, że mam następujący, prosty kod:Kolejność obsługi zdarzeń Adobe Flex/Actionscript

private function handler1(e:Event):void { .. processing ..} 
private function handler2(e:Event):void { .. processing ..} 
private function handler3(e:Event):void { .. processing ..} 

<SomeComponent myEvent1="handler1(event)" myEvent2="handler2(event)" myEvent3="handler3(event)" ... /> 

Jeśli gdzieś w mojej aplikacji (zarówno od wewnątrz samego lub innym miejscu z komponentem instancja komponentu), jeśli wysyła te zdarzenia w kolejności 1, 2 3, takich jak:

dispatchEvent(new Event('myEvent1')); 
dispatchEvent(new Event('myEvent2')); 
dispatchEvent(new Event('myEvent3')); 

są te koparki zagwarantowane na ogień w tej samej kolejności (tj handler1, handler2, handler3) ...? Wszystko, co przeszukuję w internecie (czytaj: Google), dotyczące "zlecenia przetwarzania zdarzeń Adobe" lub czegoś podobnego, odnosi się tylko do cyklu życia zdarzenia. Nie mogę jednak znaleźć niczego na temat tego konkretnego niuansu. Każda pomoc jest bardzo doceniana.

--Ian

Odpowiedz

5

Jeśli dwa zdarzenia są wywoływane jeden po drugim, jak pokazano w kodzie, drugie zdarzenie zostanie wysłane dopiero po wykonaniu wszystkich procedur obsługi pierwszego zdarzenia i zwróceniu metody dispatchEvent.

private function handler_1(e:Event):void {} 
private function handler_2(e:Event):void {} 

a.addEventListener(Event.TYPE_1, handler_1); 
a.addEventListener(Event.TYPE_2, handler_2); 

//Different events: 
//handler_1 will be called before handler_2 
a.dispatchEvent(new Event(Event.TYPE_1)); 
a.dispatchEvent(new Event(Event.TYPE_2)); 

Ale jeśli zarejestrowałeś dwóch słuchaczy zarejestrowanych z tym samym priorytetem dla zdarzenia, są one przetwarzane w kolejności, w jakiej zostały dodane.

private function handler_1(e:Event):void {} 
private function handler_2(e:Event):void {} 

a.addEventListener(Event.TYPE_1, handler_1); 
a.addEventListener(Event.TYPE_1, handler_2); 

/* 
    Same event, same priority: 
    Called based on the order in which they were added; 
    Hence handler_1 is called first. 
*/ 
a.dispatchEvent(new Event(Event.TYPE_1)); 

Można użyć parametru metody addEventListenerpriority wyegzekwować nakaz:

a.addEventListener(Event.TYPE_1, handler_1, false, 0); 
a.addEventListener(Event.TYPE_1, handler_2, false, 1);//higher priority 

/* 
    handler_2 will be invoked before handler_1 
*/ 
a.dispatchEvent(new Event(Event.TYPE_1)); 
0

one zwykle zrobić, ale nie ma gwarancji, więc nie należy zakładać, że będzie.

+0

Dostaję tę sprzeczną odpowiedź na forum Adobe: http://forums.adobe.com/thread/739912?tstart=0 – istrasci

0

Gdyby Bóg chciał, byśmy wiedzieli, w jakiej kolejności będą występować zdarzenia, nie dałby nam callLater()

;) odpowiedź

1

Ditto Roberta Bak jest. Jeśli absolutnie chcesz, aby to działało bez względu na przyczynę, możesz oznaczyć zdarzenia numerami, które zwiększają się o jeden za każdym razem, a twoi słuchacze po prostu przechowują je w jakiejś centralnej kolejce, a następnie sortuj je według indeks, który przypisałeś. Prawdopodobnie więcej pracy niż jest warte.

0

Zasadniczo cykl zdarzeń rozpoczyna się po wydaniu zdarzenia, przechodzi do jego rodzica, a następnie w górę hierarchii UI przez innych rodziców, od miejsca, z którego powraca do swoich potomków. Poniżej znajduje się schemat, który ilustruje cykl imprez w Flex:

Flex event lifecycle

Wydarzenia przejść przez różne fazy, ale niektóre zdarzenia mogą być ograniczone z niektórych fazach. Podczas tworzenia nowego wydarzenia można zapobiec bulgotaniu zdarzenia podczas fazy propagacji. Aby uzyskać więcej informacji przeczytaj Essential ActionScript 3.0 przez Colin Moock.

Zdarzenia nie są wyzwalane ani przetwarzane w dowolnej kolejności. Zależą od tego, kiedy wydarzenie zostanie wystrzelone. W środowisku Flex zdarzenia są asynchroniczne.

Powiązane problemy