2009-06-23 17 views
3

Ich habe versucht zu verstehen, wie die ActionScript-Ereignisse implementiert werden, aber ich stecke fest.Ausführungsreihenfolge der ActionScript-Ereignishandler

Ich weiß, dass AS single-threaded ist, was bedeutet, dass nur ein Event-Handler gleichzeitig ausgeführt wird, und bedeutet auch, dass Handler in einer deterministischen Reihenfolge * ausgeführt werden.

Betrachten wir zum Beispiel den folgenden Code:

1: var x = {executed: false}; 
2: foo.addEventListener("execute", function(){ x.executed = true; }); 
3: foo.dispatchEvent(new Event("execute")); 
4: assert(x.executed); 

Wenn Actionscript-Multi-Threaded war, wäre es möglich, dass die Behauptung der Linie 4 manchmal scheitern könnte und andere Erfolg haben.

Aber da AS nicht multi-threaded ist, steht, dass die Behauptung wird entweder immer fail² oder immer succeed³ zur Vernunft. Mit anderen Worten: Ereignisse werden deterministisch behandelt.

Also, ist diese Annahme (dass Ereignisse Hasen deterministisch behandelt) korrekt? Bietet Adobe eine definitive Dokumentation zu diesem Thema?

Hinweis: Ich bin nur hier mit Ereignissen von dispatchEvent versandt betroffen - Ich stelle fest, dass „extern eingeplant“ Ereignisse (Netzwerkverkehr, Benutzereingabe, Timer tickt, usw.) verhalten sich anders.


*: mit Ausnahme, natürlich, für durch nichtdeterministische Dinge wie Benutzereingaben oder Netzwerkverkehr ausgelösten Ereignisse.
²: Es würde immer fehlschlagen, wenn zum Beispiel der Algorithmus für die Ereignisbehandlung wie folgt lautet: "Schiebe neue Ereignisse auf einen Stapel, öffne dann das oberste Ereignis kontinuierlich vom Stapel, führe es bis zum Ende aus und gehe dann zum nächsten Veranstaltung".
³: es würde immer gelingen, wenn Ereignisse, die von dispatchEvent gesendet wurden, behandelt wurden, sobald sie versandt wurden.

Antwort

7

Wenn ich nicht falsch verstanden habe - in diesem Fall entschuldige ich mich! - Ich muss den anderen nicht zustimmen: Sie müssen nur den Code testen, den Sie eingereicht haben, um den Wert von x.executed traces jedes Mal wahr zu sehen.

Zum Beispiel, wenn anstelle des foo-Objekt, erhalten Sie einen IEventDispatcher (in diesem Fall, dass ich so implizit tun, mit meiner App-Objekt und seine creationComplete- Handler) zu ersetzen, würde man sehen:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="onCreationComplete()"> 

    <mx:Script> 
     <![CDATA[ 

      private function onCreationComplete():void 
      { 
       var x = {executed: false}; 
       addEventListener("execute", function() { x.executed = true; }); 
       trace(x.executed); // false 
       dispatchEvent(new Event("execute")); 
       trace(x.executed); // true 
      } 

     ]]> 
    </mx:Script> 

</mx:WindowedApplication> 

natürlich gibt es Möglichkeiten zur Steuerung Ereignisbehandlungs um (mit der Priorität Argumente der addEventListener) und verschiedene Phasen der Ereignispropagierung für Objekte in der Anzeigeliste (zB Erfassung, Targeting, sprudelt - siehe die Flex-Dokumente für detaillierte Informationen, here und here), aber in einer solchen Situation werden Ereignisse tatsächlich im Wesentlichen inline und behandelt in der Reihenfolge der Priorität.Nach der Dokumentation:

Flex Register Ereignis Hörer in der Reihenfolge, in der die addEventListener() Methoden aufgerufen werden. Flex ruft dann die Listener-Funktionen auf, wenn das Ereignis in der Reihenfolge auftritt, in der sie registriert waren. Wenn Sie jedoch einige Ereignis-Listener inline und einige mit der addEventListener() -Methode, registrieren, kann die Reihenfolge, in der die Listener für ein einzelnes Ereignis aufgerufen werden, unvorhersehbar sein.

Hoffe, dass hilft!

+0

Danke für die Antwort. Ich hatte das vermutet, aber ich habe nicht Ich möchte meiner Intuition ohne irgendeine Bestätigung vertrauen. –

-2

Zeile 4 wird IMMER vor dem Event-Handler ausgeführt, daher wird die Ausführung immer als falsch bestätigt. Nachdem die Funktion beendet wurde, wird der Handler ausgeführt.

Sie sind Punkt 2 ist der richtige Weg, um es zu betrachten.

+0

Leider, durch Experimente, das ist nicht wahr :( –

+0

@CookieOfFortune. Ich fürchte, du liegst falsch. Event Dispatching/Handhabung ist nicht unbedingt asynchron. –

Verwandte Themen