Domanda

Ho cercato di capire come vengono implementati gli eventi di ActionScript, ma sono bloccato.

So che AS è a thread singolo, il che significa che verrà eseguito un solo gestore di eventi alla volta e che i gestori verranno eseguiti in un ordine deterministico *.

Ad esempio, considera il seguente codice:

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

Se ActionScript fosse multi-thread, sarebbe possibile che l'asserzione sulla linea 4 a volte fallisse e succedesse ad altri.

Ma poiché AS non è multi-thread, è ovvio che l'asserzione sempre fallirà & # 178; o sempre riescono & # 179 ;. O, in altre parole, gli eventi saranno gestiti in modo deterministico.

  

Quindi, questo assunto (che gli eventi sono gestiti in modo deterministico) è corretto? Adobe fornisce documentazione definitiva in merito?

Nota: sono solo interessato agli eventi inviati da dispatchEvent & # 8211; Mi rendo conto che "spedito esternamente" gli eventi (traffico di rete, input dell'utente, ticker dei timer, ecc.) si comportano diversamente.


*: ad eccezione, ovviamente, per eventi innescati da cose non deterministiche come l'input dell'utente o il traffico di rete.
& # 178 ;: fallirebbe sempre se, ad esempio, se l'algoritmo di gestione degli eventi fosse: " spingere nuovi eventi su uno stack, quindi estrarre continuamente l'evento principale dallo stack, eseguirlo fino a quando non termina, quindi passare a il prossimo evento " ;.
& # 179 ;: avrebbe sempre successo se gli eventi inviati da dispatchEvent venivano gestiti non appena venivano spediti.

È stato utile?

Soluzione

A meno che non sia frainteso, nel qual caso mi scuso! - Non sono d'accordo con gli altri: devi solo testare il codice che hai inviato per vedere ogni volta il valore di x.executed trace true.

Ad esempio, se, al posto del tuo oggetto foo, dovessi sostituire un IEventDispatcher (in questo caso lo faccio implicitamente, con il mio oggetto app e il suo gestore CompleteCreazione), vedresti:

<?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>

Naturalmente, ci sono modi per controllare la gestione degli eventi order (usando l'argomento prioritario di addEventListener) e varie fasi di propagazione degli eventi per oggetti nell'elenco di visualizzazione (ad es. acquisizione, targeting, bubbling: consultare i documenti Flex per informazioni dettagliate, qui e qui ), ma in questo tipo di situazione, gli eventi sono effettivamente gestiti essenzialmente in linea e in ordine di priorità. Secondo i documenti:

  

Flex registra i listener di eventi in   ordine in cui addEventListener ()   i metodi sono chiamati. Flex quindi chiama   l'ascoltatore funziona quando l'evento   si verifica nell'ordine in cui erano   registrato. Tuttavia, se ti registri   alcuni ascoltatori di eventi in linea e alcuni   con il metodo addEventListener (),   l'ordine in cui si trovano gli ascoltatori   può essere chiamato per un singolo evento   imprevedibile.

Spero che ti aiuti!

Altri suggerimenti

la riga 4 verrà SEMPRE eseguita prima del gestore dell'evento, quindi eseguita verrà sempre dichiarata falsa. Al termine della funzione, verrà eseguito il gestore.

Il punto 2 è il modo corretto di osservarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top