Node.js は、イベント駆動型アーキテクチャを使用した非同期 I/O の処理に優れています。このシステムの中心には、イベント駆動型アプリケーションの構築に不可欠な EventEmitter クラスがあります。この記事では、Node.js の EventEmitter とその仕組み、そして実際のアプリケーションで効果的に使用する方法について説明します。また、イベント処理、カスタム イベント、ベスト プラクティス、イベント駆動型プログラミングの力を示すユースケースについても取り上げます。
EventEmitter は、イベントの発行と処理を容易にする Node.js のコア クラスです。イベントを作成してリッスンできるため、非同期操作の管理や、モジュール式で保守可能なアプリケーションの構築が容易になります。
EventEmitter クラスは Node.js イベント モジュールの一部であるため、使用する前にインポートする必要があります。
例:
const EventEmitter = require('events'); const eventEmitter = new EventEmitter();
EventEmitter オブジェクトができたので、イベントを発行してリッスンする方法を定義しましょう。
emit() メソッドを使用してイベントを発行し、on() または addListener() メソッドを使用してイベントをリッスンできます。
例:
const EventEmitter = require('events'); const eventEmitter = new EventEmitter(); // Create an event listener eventEmitter.on('greet', (name) => { console.log(`Hello, ${name}!`); }); // Emit an event eventEmitter.emit('greet', 'Aadyaa');
出力:
Hello, Aadyaa!
この例では、greet というカスタム イベントを定義します。イベントが発行されると、引数「Aadyaa」がイベント リスナーに渡され、挨拶が記録されます。
同じ EventEmitter オブジェクトから複数のイベントを発行し、別のイベント リスナーを使用してそれらを処理できます。
例:
const EventEmitter = require('events'); const eventEmitter = new EventEmitter(); // Event listeners eventEmitter.on('start', () => { console.log('Starting...'); }); eventEmitter.on('stop', () => { console.log('Stopping...'); }); // Emit events eventEmitter.emit('start'); eventEmitter.emit('stop');
出力:
Starting... Stopping...
この例では、複数のイベントを個別に処理して、アプリケーション内のさまざまなアクションをより詳細に制御する方法を示します。
イベント リスナーは非同期にすることもできます。 Node.js を使用すると、イベント リスナー内で非同期関数を定義できます。これは、ノンブロッキング操作に役立ちます。
例:
const EventEmitter = require('events'); const eventEmitter = new EventEmitter(); // Async event listener eventEmitter.on('fetchData', async () => { const data = await new Promise((resolve) => { setTimeout(() => resolve('Data fetched!'), 2000); }); console.log(data); }); // Emit the event eventEmitter.emit('fetchData');
出力 (2 秒後):
Data fetched!
この例では、setTimeout を使用して非同期操作をシミュレートする fetchData のイベント リスナーを定義します。リスナーは、取得したデータをログに記録する前に、Promise が解決されるのを待ちます。
場合によっては、イベント リスナーがその目的を達成した後、削除する必要があるかもしれません。 RemoveListener() または off() メソッドを使用して特定のリスナーを削除するか、removeAllListeners() メソッドを使用して特定のイベントのすべてのリスナーを削除できます。
例:
const EventEmitter = require('events'); const eventEmitter = new EventEmitter(); const greetListener = (name) => { console.log(`Hello, ${name}!`); }; // Add and remove an event listener eventEmitter.on('greet', greetListener); eventEmitter.emit('greet', 'Aadyaa'); eventEmitter.removeListener('greet', greetListener); eventEmitter.emit('greet', 'Aadyaa'); // No output
出力:
Hello, Aadyaa!
この場合、リスナーは一度呼び出された後に削除されるため、その後のイベント発行には影響がありません。
デフォルトでは、EventEmitter オブジェクトは 1 つのイベントに対して最大 10 個のイベント リスナーを持つことができます。この制限を超えると、警告が表示されます。この制限は、setMaxListeners() メソッドを使用して調整できます。
例:
eventEmitter.setMaxListeners(15);
これにより、EventEmitter は警告を発行することなく、イベントごとに最大 15 個のイベント リスナーを処理できるようになります。
eventEmitter.on('error', (err) => { console.error('Error:', err.message); }); eventEmitter.emit('error', new Error('Something went wrong!'));
イベント駆動型プログラミングは、複数のイベント (メッセージの送受信など) を非同期に処理する必要があるチャット アプリケーションでよく使用されます。 EventEmitterを使って簡単なチャットアプリケーションを実装してみましょう。
例:
const EventEmitter = require('events'); const eventEmitter = new EventEmitter(); let users = {}; // Register a new user eventEmitter.on('userJoined', (username) => { users[username] = []; console.log(`${username} has joined the chat!`); }); // Send a message eventEmitter.on('sendMessage', (username, message) => { if (users[username]) { users[username].push(message); console.log(`${username} sent: ${message}`); } }); // User leaves the chat eventEmitter.on('userLeft', (username) => { if (users[username]) { delete users[username]; console.log(`${username} has left the chat.`); } }); // Simulating chat activity eventEmitter.emit('userJoined', 'Aadyaa'); eventEmitter.emit('sendMessage', 'Aadyaa', 'Hello, everyone!'); eventEmitter.emit('userLeft', 'Aadyaa');
出力:
Aadyaa has joined the chat! Aadyaa sent: Hello, everyone! Aadyaa has left the chat.
In this basic chat application, we use events to manage user interactions, such as joining the chat, sending messages, and leaving the chat.
Event-driven programming is a powerful paradigm that allows you to build scalable and efficient applications. By mastering the EventEmitter in Node.js, you can handle asynchronous events with ease, ensuring that your application remains responsive and modular. Whether you're building a chat application, handling real-time notifications, or managing file streams, the EventEmitter class provides the tools to create event-driven solutions.
In this article, we covered the basics of EventEmitter, working with multiple events, handling asynchronous events, removing listeners, and common best practices. Understanding and applying these concepts will significantly enhance your ability to write effective event-driven Node.js applications.
以上がNode.js の EventEmitter を使用したイベント駆動型プログラミングをマスターするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。