検索
ホームページウェブフロントエンドjsチュートリアルNode.jsの詳細説明: eventsイベントモジュール

Nodejs のコア API のほとんどは非同期イベント駆動設計に基づいて設計されており、イベントを配布できるすべてのオブジェクトは EventEmitter クラスのインスタンスです。

ご存知のとおり、nodejs は単一のスレッドで実行されるため、nodejs はイベント ポーリングを使用してイベント キュー内のイベント メッセージを継続的にクエリし、イベントに対応するコールバック関数を実行する必要があります。これは、 Windows のメッセージ マッピング メカニズム。より詳細な実装リンクについては、別途情報を参照してください。

以下ではEventEmitterの使い方を紹介します。

1. イベントのリッスンとイベントの配布

EventEmitter インスタンスは、以下に示すように、on または addListener を使用してイベントをリッスンし、emit() メソッドを使用してイベントを配布できます。

const events = require('events'),
   EventEmitter = events.EventEmitter,
   util = require('util');
function myEmiter(){
  EventEmitter.call(this);
};
util.inherits(myEmiter,EventEmitter);//继承EventEmitter类
const myEmitterIns = new myEmiter();
myEmitterIns.on('data',(o)=>{
  console.log('receive the data:'+o.a);
});

実行結果は次のとおりです:

E:developmentdocumentnodejsdemo>nodeevent-example.js

データを受信します:1

2. パラメータをイベントリスニングコールバック関数に渡します

上記の例からわかるように、emit() メソッドは、コールバック関数に任意のパラメータのセットを渡すことができます。注意すべき点は、this キーワードは、アロー関数を除いて、emit メソッドを呼び出す EventEmiter インスタンスをポイントしていることです。アロー関数内の this は時間バインディングが定義されているため、グローバル this に設定されます。以下に示すように:

class myEmiter extends EventEmitter{}//继承EventEmitter类
const myEmitterIns = new myEmiter();
 
myEmitterIns.on('data',(o)=>{
  console.log('receive the data:'+o.a);
});
myEmitterIns.emit('data',{a:1});


実行結果は次のとおりです:

E:developmentdocumentnodejsdemo>nodeevent-example.js

これは通常のコールバック関数内です:

myEmiter {

domain: null,

_events: { data: [Function ], data1: [Function] },

_eventsCount: 2,

_maxListeners: unknown }
this in the arrow callback function:
{}

ここで、arrow 関数でのこれについて説明します。アロー関数が実装できる理由 定義時に this をバインドするのは、アロー関数内に this をバインドする機構がないため、外側のスコープで this を使用するため、コンストラクターとして使用できません。

3. イベントリスナーの実行シーケンス

EventEmiter インスタンスは複数のイベントを連続してトリガーすることができ、最初のイベント処理関数が完了していなくても、EventEmiter は同期モードで実行されます。イベントは次のように実行されます:

class myEmiter extends EventEmitter{}
const myEmitterIns = new myEmiter();
myEmitterIns.on('data',function(data){
  console.log("普通回调函数中this:");
  console.log(this);
});
myEmitterIns.on('data1',(data1)=>{
  console.log("箭头回调函数中this:");
  console.log(this);
});
myEmitterIns.emit('data',{a:1});
myEmitterIns.emit('data1',{a:1});


実行結果は次のとおりです:

E:developmentdocumentnodejsdemo>node event-example.js

data イベント実行: 4721.401ms

data1 イベントが実行を開始しました...

もちろん、以下に示すように、コールバック関数で setTimeout、setImmediate、process.nextTick() などの非同期操作を使用して、非同期効果を実現できます。

class myEmiter extends EventEmitter{}
const myEmitterIns = new myEmiter();
myEmitterIns.on('data',function(data){
  console.time('data事件执行了');
  for(var i = 0 ; i< 100000; i++)
    for(var j = 0 ; j< 100000; j++)
      ;
  console.timeEnd(&#39;data事件执行了&#39;);
});
myEmitterIns.on(&#39;data1&#39;,(data1)=>{
  console.log("data1事件开始执行...");
});
myEmitterIns.emit(&#39;data&#39;,{a:1});
myEmitterIns.emit(&#39;data1&#39;,{a:1});



実行結果は次のとおりです。 E:developmentdocumentnodejsdemo> ノードのevent-example.js

data1イベントが実行されました...

dataイベントが実行されました...

4. ワンタイムイベントモニタリング

EventEmiterはイベントをリッスンするために一度使用できます。イベント ハンドラーは 1 回だけトリガーされます。以下に示すように、リスナーがログアウトしているため、イベントは発行後に無視されます。

myEmitterIns.on(&#39;data&#39;,function(data){
  setImmediate(()=>{
    console.log(&#39;data事件执行了...&#39;);
  });
});



実行結果は次のとおりです。 js

this is first call!

上記の結果から、「one」イベントは 1 回だけ実行されることがわかります。

5. イベント バインディングを削除する

DOM イベント リスニングと同様に、EventEmiter もイベント バインドを解除するためにイベント バインディングを削除できるため、コールバック関数のリスナーは名前付き関数である必要があります。関数が参照型であるため、関数が見つかりません。以下に示すように、関数本体が同じであっても、同じ関数ではありません。

myEmitterIns.once(&#39;one&#39;,(data)=>{
  console.log(data);
});
myEmitterIns.emit(&#39;one&#39;,&#39;this is first call!&#39;);
myEmitterIns.emit(&#39;one&#39;,&#39;this is second call!&#39;);


実行結果は次のとおりです。


E:developmentdocumentnodejsdemo>nodeevent-example.js

hello data!

E:developmentdocumentnodejsdemo>

実行結果からわかるように、data イベントは匿名関数を使用しているため削除されませんが、data1 イベントは正常に実行されます。縛られていない。ここで注意すべき点は、エミットがイベントをトリガーした後、そのイベントにバインドされているすべてのコールバック関数が呼び出されるということです。コールバック関数でremoveListener関数を使用して別のコールバックを削除しても、その後のイベント キューは役に立ちません。コールバックを削除しました。以下に示すように:

myEmitterIns.on(&#39;data&#39;,function(e){
  console.log(e);
});
myEmitterIns.removeListener(&#39;data&#39;,function(e){
  console.log(e);
});
myEmitterIns.emit(&#39;data&#39;,&#39;hello data!&#39;);
function deal(e){
  console.log(e);
}
myEmitterIns.on(&#39;data1&#39;,deal);
myEmitterIns.removeListener(&#39;data1&#39;,deal);
myEmitterIns.emit(&#39;data1&#39;,&#39;hello data1!&#39;);

6. イベント リスナーとリスニング関数の数を取得します

指定されたイベントのリスナーの数を取得するには、emiter.listeners(eventName) 関数を使用します。指定されたイベントのすべてのリスナーを取得するために使用されます。 listen 関数は次のように使用されます:

function dealData1(e){
  console.log(&#39;data事件执行了...A&#39;);
}
myEmitterIns.on(&#39;data&#39;,function(e){
  console.log(e);
  myEmitterIns.removeListener(&#39;data&#39;,dealData1);//这里解除dealData1的绑定
});
myEmitterIns.on(&#39;data&#39;,dealData1);
myEmitterIns.emit(&#39;data&#39;,&#39;data事件执行了...B&#39;);
/*执行结果为:
 data事件执行了...B
 data事件执行了...A
*/
//再次触发该事件时,dealData1回调已经被解除绑定了
myEmitterIns.emit(&#39;data&#39;,&#39;data事件执行了...&#39;);
//data事件执行了...
   
另外可以使用removeAllListeners()解除所有事件的绑定。


実行結果は次のとおりです:


E:developmentdocumentnodejsdemo>nodeevent-example.js

データイベントエミッタ インスタンスのは 2 つのコールバック関数にバインドされています

それらは次のとおりです: [ [関数: cbA]、[関数: cbB] ]

7. エミッタ リスナーの最大数を取得および設定します

nodejs は、同じイベントは 10 を超えてはなりません。これは、次のように EventEmitter.defaultMaxListeners プロパティを確認することでわかります。

var cbA = ()=>{},
  cbB = ()=>{};
var emitter = new myEmiter();
emitter.on(&#39;data&#39;,cbA);
emitter.on(&#39;data&#39;,cbB);
console.log(&#39;emitter实例的data事件绑定了%d个回调函数&#39;,emitter.listenerCount(&#39;data&#39;));
console.log(&#39;它们是:&#39;,emitter.listeners(&#39;data&#39;));


emitter は getMaxListeners() メソッドを通じてリスナーの最大数を取得し、最大数を設定します以下に示すように、setMaxListeners(n) メソッドを介してリスナーの数を変更します。

実行結果は次のとおりです:

E:developmentdocumentnodejsdemo>nodeevent-example.js
エミッターイベントリスナーの最大数は: 1
(node:6808) 警告: EventEmitter のメモリリークの可能性が 2 つのデータリスナー
で検出されました。制限を増やすには、エミッター .setMaxListeners() を使用します

上記の結果に示されているように、リスナーの最大数が設定されている場合は、同じイベントのリスナーの最大数を超えないようにすることが最善です。メモリリークの原因となります。


声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Python vs. JavaScript:開発環境とツールPython vs. JavaScript:開発環境とツールApr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScriptはCで書かれていますか?証拠を調べるJavaScriptはCで書かれていますか?証拠を調べるApr 25, 2025 am 12:15 AM

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptの役割:WebをインタラクティブでダイナミックにするJavaScriptの役割:WebをインタラクティブでダイナミックにするApr 24, 2025 am 12:12 AM

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScript:接続が説明しましたCおよびJavaScript:接続が説明しましたApr 23, 2025 am 12:07 AM

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

Webサイトからアプリまで:JavaScriptの多様なアプリケーションWebサイトからアプリまで:JavaScriptの多様なアプリケーションApr 22, 2025 am 12:02 AM

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

Python vs. JavaScript:ユースケースとアプリケーションと比較されますPython vs. JavaScript:ユースケースとアプリケーションと比較されますApr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

JavaScript通訳者とコンパイラにおけるC/Cの役割JavaScript通訳者とコンパイラにおけるC/Cの役割Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

JavaScript in Action:実際の例とプロジェクトJavaScript in Action:実際の例とプロジェクトApr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、