2009-06-23 6 views
2

すると、ActionScriptでは、イベントが送出された:イベントハンドラが実行されているActionScript:イベントハンドラはいつ実行されますか?

foo.addEventListener("some event", someHandler); 
foo.dispatchEvent(new Event("some event")); 

どの時点で?

私はAdobe developer guideの終わりにこれをキャッチしたので、私は尋ねる:リモートサービスへの呼び出しが行われた後、いくつかのプロパティが[AsyncTokenです]に割り当てられていることを

注意してください。マルチスレッド言語では、トークンが割り当てられる前に結果が返される競合状態が存在します。 この状況は、現在実行中のコードが終了するまでリモート呼び出しを開始できないため、ActionScriptでは問題ありません

しかし、 "現在実行中のコード"が意味することについての情報は見つかりませんでした。


も参照してください:ActionScript event handler execution order

答えて

4

ActionScriptは、シングルスレッドのイベント駆動型言語です。 Actionscriptに "main"メソッドがないことに注目してください。すべてのコードはイベントに属します。初期化コードは "creationComplete"イベントに応答して配置される傾向があります。そのイベントハンドラ内のコードが実行されると、次のイベントが実行されます。したがって、実行した場合:

private function someOtherHandler():void 
{ 
    foo.addEventListener("some event", someHandler); 
    while(true) { ... spin wheels ... } 
} 

現在実行中のコード(無限ループ)が決して完了しないため、他のハンドラは実行できません。

Flashはおそらく複数のスレッドを内部的に使用しますが、これは開発者から抽象化されていることに注意してください。

+0

ああ、それは私が必要としていたものです。説明をありがとう。 –

+0

これは、2つのイベントを順番に(foo.dispatch(a)、foo.dispatch(b))2つのイベントを送出すると、イベント 'a'のハンドラが前に実行されることが保証されます'b'のハンドラ?それとも、ハンドラを実行する際に非決定性があるのでしょうか? –

+1

いいえ、電話をかけて結果を得るのに違いがあります。ハンドラは非同期に呼び出され、bはaの前に戻ることができます。これは、最初に戻り値が返された場合、bハンドラが実行される前にaハンドラ内のすべてのコードが実行されることを意味します。 –

5

dispatchEvent()をActionScriptで呼び出すと、ハンドラはすぐに実行されます。順序は、最初にaddEventListener()を呼び出すときに指定された優先順位によって決定され、優先順位が同じであれば追加された順序で決定されます。まず来て、最初に務めました。

URLLoaderインスタンスからのEvent.COMPLETEインスタンスまたはネットワーク通信を必要とするイベントなど、Flash Playerから内部的にイベントが送出された場合、ActionScriptの実行中はディスパッチされません。それは後で待ち行列に入れられます。私はこれがドキュメントに記述されている競合状態を避けることを正確に想像しています。 「後で」は次のフレームですが、現フレームの他のActionScriptがすべて実行された後に発生する可能性があります。