適切な使用Node.jsのイベント

序文

イベント駆動型プログラミングに先立ち、通信の標準的な方法は非常に簡単である内部手続きで人気となった:コンポーネントは他にメッセージを送信したい場合は、明示的にそのコンポーネントのメソッドを呼び出します。しかし、それはイベント駆動型の代わりに、呼び出し元と反応しています。

イベントのメリット

この方法は、複数の別個の構成部品を可能にします。我々はプログラムを書くために続けて、それが適切なタイミングでそれらをトリガーするイベントの全コースを認識し、拡張が容易になり、各イベントのために1つ以上のイベント・リスナーを添付します。私たちは、既存のリスナーを変更したり、イベントのアプリケーション部をトリガすることなく、特定のイベントのためのより多くのリスナーを追加することができます。私たちは、オブザーバーパターンについて話しています。

イベント駆動型アーキテクチャを設計します

イベントの認識は非常に重要であり、我々は最終的にそれがイベントにアタッチ上で多くのリスナーを削除または修正するために私たちを強制する可能性があるため、システムから既存のイベントを削除または交換する必要がありますする必要はありません。私の一般的なルールは、ビジネス・ロジックでトリガイベントは実行ユニットを完了するために、場合にのみ考慮することです。

あなたはユーザー登録後に別の電子メールの束を送信する場合。登録プロセス自体は、多くの複雑なステップとクエリを伴うことが、ビジネスの観点から、これはただの一歩です。送信する各電子メールは、別のステップです。登録が完了するとそのため、すぐにイベントが非常に重要であるリリース。だから我々は、複数のリスナーを添付し、各リスナーは、電子メールのいずれかのタイプを送信する責任があります。

ノードの非同期イベント駆動型アーキテクチャオブジェクトの数は、「エミッタ」の呼ばれていました。彼らは、という名前のイベントを発行し、関数を呼び出しますこれらのイベントは、「リスナー」と呼ばれています。すべてのオブジェクトは、イベントを発行している  持つEventEmitter クラスのインスタンス。私たちは、独自のイベントを作成することができ、それを使用します。

:さんは(私はあなたがこの文書を見てお勧めビルトイン・イベントのモジュールを使用してみましょうhttps://nodejs.org/api/events持つEventEmitterへのアクセスを得るために...)。

constの持つEventEmitterは=( 'イベント')が必要です。

constのmyEmitter =新しい持つEventEmitter(); 

module.exportsは= myEmitter。

これは、HTTPリクエストを受信するための責任があり、当社のサーバー側のプログラムの一部であり、新しいユーザを保存して、シグナル伝達事象:

CONST myEmitter =( './ my_emitter')を必要とします。

//登録手順を実行します

//このイベントが通過するメッセージとして新しいユーザーオブジェクトを渡します。
myEmitter.emit( 'ユーザ登録'、ユーザ);

リスナーの追加、別のモジュール:

CONST myEmitter =( './ my_emitter')を必要とします。

myEmitter.on( 'ユーザ登録'、(ユーザー)=> { 
//メールまたは何を送ります。
})。

分離の戦略と実装は非常に良い習慣です。この場合、戦略はどのようなイベントリスナーをサブスクライブするものを意味します。それは自分自身を実現するために、リスナーを意味します。

CONST myEmitter =( './ my_emitter')を必要とします。
CONST sendEmailOnRegistrationは=( './ send_email_on_registration')を必要とします。
CONST someOtherListenerは=( './ some_other_listener')を必要とします。

myEmitter.on(sendEmailOnRegistration、 'ユーザ登録')。
myEmitter.on( 'ユーザ登録'、someOtherListener)。
module.exportsは=(ユーザー)=> { 
//ウェルカムメールまたは何を送信します。
}

この分離は、リスナーは、それが送信された同一のメッセージ(ユーザオブジェクト)の他のイベントに取り付けることができ、再使用することができることができます。リスナー複数の追加の同期シーケンスで実行される単一のイベント、に取り付けられている場合にも重要です。したがってsomeOtherListenerは、実行sendEmailOnRegistration後に実行を完了します。

あなたはリスナーが非同期的に実行したい場合は、次のようにしかし、ちょうど、その実施を梱包setImmediateを使用します。

module.exportsは=(ユーザー)=> { 
setImmediate(()=> { 
//ウェルカム電子メールまたは何を送ります。
})。
}

あなたのリスナーは単純保持してみましょう

書くとき、リスナーは、単一責任の原則を遵守すべきです。リスナーは、一つのことを行う必要があり、物事を成し遂げます。たとえば、次のようにあまりにも多くの条件やデータに基づいて何をすべきかを決定するために、リスナーを書く避けるために(メッセージ)イベントが来ました。より適切であろう。この場合、さまざまなイベントを使用します。

CONST myEmitter =( './ my_emitter')を必要とします。

//登録の手順を実行して

、新しいユーザーがすぐに起動された場合//アプリケーションが異なる反応をする必要があります。
IF(user.activated){ 
myEmitter.emit( 'ユーザ登録:活性化'、ユーザ)。

}他{ 
myEmitter.emit( 'ユーザ登録'、ユーザ); 
}
CONST myEmitter =( './ my_emitter')を必要とします。
CONST sendEmailOnRegistrationは=( './ send_email_on_registration')を必要とします。
CONST someOtherListenerは=( './ some_other_listener')を必要とします。
CONST doSomethingEntirelyDifferent =( './ do_something_entirely_different')を必要とします。

myEmitter.on(sendEmailOnRegistration、 'ユーザ登録')。
myEmitter.on( 'ユーザ登録'、someOtherListener)。

myEmitter.on( 'ユーザ登録:活性化'、doSomethingEntirelyDifferent)。
ビュー生

リスナーの明確な分離、必要に応じて

前の例では、リスナー関数の完全に独立しています。しかし、(今回は道である)、手動でオブジェクトに関連付けられたリスナーの場合は加入イベントから分離する必要があります。そうでない場合、オブジェクトは、オブジェクト(リスナー)の一部は、外部オブジェクト(エミッタ)への参照であり続けるため、メモリリークが存在してもよい、ガベージコレクションになることはありません。

私たちはチャットプログラムを開発し、新しいメッセージは、ユーザーがチャットルームに入る到着したとき、表示通知がユーザーオブジェクト自体の内部に配置されなければならないことを願っている場合たとえば、私たちは行う可能性があります:

クラスChatUser { 

displayNewMessageNotification(newMessage){ 
警告メッセージか何かを押し//。
} 

// `chatroom`を持つEventEmitterのインスタンスです。
connectToChatroom(チャットルーム){ 
chatroom.on( 'メッセージ受信'、this.displayNewMessageNotification)。
} 

disconnectFromChatroom {(チャットルーム)
chatroom.removeListener( 'メッセージ受信'、this.displayNewMessageNotification)。
} 
}

ユーザーが自分のラベルを閉じるか、一時的にインターネットから切断すると、我々はそれだけでオフラインで他のユーザーに通知することでした、サーバー側でコールバックを開始することをお勧めします。もちろん、この時点ではどんな意味がありませんdisplayNewMessageNotificationオフラインユーザーを呼び出します。我々はそれを削除しない限り、それ以外の場合は、新しいメッセージを呼び出すために使用され続けます。ユーザーオブジェクト外の不要な呼び出しに加えて、これを怠ると、恒久的にメモリに保持されます。ユーザーがオフラインのときに、サーバー側のコールバックにdisconnectFromChatroomを呼び出す必要があります。

注意事項

あなたが注意されていない場合、でも疎結合イベント駆動型アーキテクチャが複雑化につながる可能性が非常に困難になり、依存関係の追跡システムをもたらすことができます。私たちは、リスナー内からイベントを送信した場合、プログラムはこのような問題を特に受けやすいだろう。これは、イベントの予期せぬ連鎖をトリガすることができます。

 

また、記事に興味がある可能性があります。

記事の同時リリース:  https://www.geek-share.com/detail/2769911794.html

おすすめ

転載: www.cnblogs.com/xiaoqifeng/p/10930206.html