3章EventEmitterとストリーム

「2章 非同期プログラミング」で扱った非同期処理は、処理の要求とその結果が常に一対一でした。では、1回の要求に対して結果が複数回発生するような非同期処理は、どのように実装すればよいでしょうか。Promiseインスタンスは一度settled状態になったらそれ以降状態が変化しないため、そのような処理を実装するのには向きません。

本章では、この種の非同期処理を実現するためにNode.jsでどのような仕組みが用意されているかを見ていきます。

3.1 ObserverパターンとEventEmitter

「2章 非同期プログラミング」でnginxのイベントループについて触れましたが、Webサーバが接続を受け付ける処理は、1回の要求に対して結果が複数回発生する非同期処理と考えられます。ここでは、要求とはWebサーバの起動であり、結果とは起動したサーバに対するHTTPリクエストです。さらに、サーバから得たい結果はリクエストに関するものだけとは限りません。サーバの起動完了や停止、エラー発生のタイミングで何らかの処理を行いたければ、それらも結果として通知してもらう必要があります(図3-1)。

Webサーバの起動と関連する結果の通知

図3-1 Webサーバの起動と関連する結果の通知

Node.jsではhttpという標準モジュールを使ってWebサーバを起動できますが、このモジュールはObserverパターンを使ってこの要件を実現します。Observerパターンは、JavaScriptに限らずプログラミング言語一般でよく用いられるデザインパターンの1つです。このパターンでは、監視対象(Subject)に対して発生した何らかのイベントが、監視役(Observer)に逐一通知されます。ObserverはあらかじめSubjectに対して監視を行うための登録処理を行い、Subjectはイベント発生のタイミングで登録済みのObserverに対して通知処理を実行します。それぞれのSubjectには複数のObserverを登録できます。 ...

Get ハンズオンNode.js now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.