2012-03-02 9 views
2

これまで存在するシステムでは、リスナーを接続すると非同期です。 イベントドリブンスタイルを使用するシステムでは、イベントasyncが発生します。 イベント発光は常に非同期べきか?作るために妥協が、そう他の方法発光イベントは同期的に間違っていますか?

を行うには間違いですがありませんか

+0

これはどこかの引用ですか? – hugomg

+0

@missingnoそれは私の同僚の引用です。 – Raynos

+0

'.forEach'をソートのイベントシステムと見なさないのはなぜですか? –

答えて

0

デザインパターンの味があるためイベントエミッタが同期して使用されるケースがありますが、ほとんど意味がないと思います。基本的にあなたのアプリケーションがやっていることなら、他のすべての関数を呼び出すときに常に関数を呼び出そうとするべきです。同期イベントエミッタはまったく珍しいことではありませんが、私はそれらが悪い設計選択であり、避けるべきだと思います。

また、テスト目的でイベントをシミュレートしたいときに、同期イベントエミッタがJavaScriptで意味を持ちますが、非同期イベントエミッタによって駆動されるはずです。

1

イベントエミッタは、特定のイベント(文字列)に対していくつかの関数を呼び出す大きなループ以外のものではありません。あるイベントに対して数千から数十万のリスナー(関数)がバインドされており、そのイベントタイプをディスパッチする必要があるとします。そのディスパッチが同期的に発生した場合は、すべての関数が呼び出されるまでアプリケーション全体を停止させてしまいます。イベントエミッターは、しばしば疎結合のアーキテクチャーと引き合いに出合うため、恐ろしいことになります。

この進行状況では、ある種の非同期が存在する必要があります。

+0

'dispatchEvent'は同期です。ノードの 'EventEmitter'は同期型です – Raynos

+0

@Raynos:このポストの私の例がノードに適用されることを意味しますか? – jAndy

+0

['Communications.dispatch'](https://github.com/jAndreas/BarFoos/blob/master/development/plugins/core_plugin_communication.js#L33)は同期 – Raynos

0

いいえ、そうではありません。

イベントを発行しているとは、発光または処理が非同期である必要があるとは限りません。

あなたのイベント処理は、同期の実行に依存してはいけません。

例として、ほとんどのGUIフレームワークはイベントベースであり、単一のスレッドで実行されます。

+0

GUIは、ユーザからの入力を非同期的に受け取ります。 GUIでイベント駆動型プログラミングを使用することの全ポイントは、知覚される応答性を改善することです。 JavaScriptのイベント処理のように、あるスレッドでタイトなループでイベントを処理しているかもしれませんが、複数のイベントをキューに入れて処理することはできません。できるだけ早く私は、ユーザー、イベントエミッターを解放します。あなたが最初のものをまだ処理している間、私はブラウザで複数のクリックを行うことができます。 Asycnエミッタは、リスナの同時実行と同じではありません。 –

0

これは古い質問ですが、回答には同意しません。正しい答えは、常に正しい答えがないということです。人々は非同期の理由を挙げており、これらは有効ですが、同期性が望ましい他のケースもあります。私は便利なpublish()とpublishSync()メソッドを両方持つことができるPubSubライブラリを使用します(デフォルトは非同期です)。

イベントを同期させたい場合は、すべてのリスナーがイベント時に現在の状態にアクセスできるようにする場合があります。

非同期呼び出しが非ブロックであるため、(JavaScriptのように)単一スレッドのUI更新を許可するという点に関して、これはある点に当てはまります。継続的に更新されたUI(アニメーション化されている)をお持ちの場合、時間のかかる「後で」と比べて何か時間を費やしても大したことはありません。いずれにしても時間がかかる場合は、アニメーションをブロックしてフレームレートを落とします。私はときどきこのような同期をとることをお勧めします。実行完了までのメリットがあるので、テストとプロファイルをより簡単に行うことができます。すべてリスナーが1/fps時間でイベントを累積的に処理しています。非同期リスナーは、バックを渡すだけでなく、これをプロファイリングするのがはるかに厄介です。

リスナーが呼び出されるのは、構築時またはコンパイル時にコンポーネントが互いに認識しないようにするという意味で、「知らない」とは違う点ですアプリケーションに他のコンポーネントがどのように存在し、リスナーを登録しているかを知ることはできません。おそらくあなたが唯一のプログラマーであっても、後者の意味で知らないようにすることに利点があります(例えば、あなた自身のコードベースに対する将来の変更についてあまり仮定しないようにするなど)が、は、人間として、基本的には、何人かの仕事を知っているリスナーの潜在的に無限の数があるのとは対照的に、多くの仕事をするために数十人のリスナーを登録していることを知っています。後者はしばしば極端な(時期尚早な)最適化です。単純に非同期呼び出しを行うという考えは、に後者が不明であることが分かりません。 Asyncは魔法のように無限の処理時間を買うわけではありません。また、個々のリスナーは、エミッタまたはプログラマが処理する時間を知ることもできません。 (イベントシステムにこの情報が含まれていれば可能ですが、それはpubsubパターンを超えている可能性があります)

関連する問題