Node.jsのイベントの詳しい説明

青灯夜游
リリース: 2020-12-01 17:34:01
転載
3104 人が閲覧しました

Node.jsのイベントの詳しい説明

関連する推奨事項: 「nodejs チュートリアル

フロントエンドは確かにイベントに精通しており、ウィンドウのスクロール イベントをバインドします

window.addEventListener('scroll', ev => {
	console.log(ev);
});
ログイン後にコピー

Node.js ほとんどの非同期操作はイベント駆動型です。イベントをトリガーできるすべてのオブジェクトは、EventEmitter クラス

イベント リスニング

を継承します。 on

Node.js イベント リスニングは jQuery API と非常によく似ていますemitter.on(eventName,listener)

const ee = new EventEmitter();
ee.on('foo', () => console.log('a'));
ログイン後にコピー
  1. EventEmitter インスタンスはリスナー配列を維持します。および各リスナーのデフォルトは配列の末尾に追加されます
  2. リスナーが追加されるたびに、追加されたかどうかはチェックされません。複数回呼び出して同じイベント名とリスナーを渡すと、リスナーが複数回追加されるようにします

prependListener

emitter.prependListener(eventName,listener)
リスナーを追加できるのは、 prependListener を介したリスナー配列の先頭

const ee = new EventEmitter();
ee.prependListener('foo', () => console.log('a'));
ログイン後にコピー

once

リスナーを 1 回トリガーしてその後トリガーしないようにする場合は、once を使用してイベント

const ee = new EventEmitter();
ee.once('foo', () => console.log('a'));
ログイン後にコピー
# をバインドできます。 ##イベントのトリガー

emitter.emit(eventName[, ... args])開発者のブラウザ環境でのイベント関連の作業のほとんどは、イベントをサブスクライブすることです。つまり、イベント処理関数のリスナーをバインドするためです。Node.js イベント プログラミングでは、多くの場合、実際のトリガー イベントであるイベント オブジェクトを作成する必要があります。 Emit メソッドを使用して、
同期的に eventName という名前のイベントに登録されている各リスナーをリスナーの登録順に呼び出し、指定されたパラメーター

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// 第一个监听器。
myEmitter.on('event', function firstListener() {
  console.log('第一个监听器');
});
// 第二个监听器。
myEmitter.on('event', function secondListener(arg1, arg2) {
  console.log(`第二个监听器中的事件有参数 ${arg1}、${arg2}`);
});
// 第三个监听器
myEmitter.on('event', function thirdListener(...args) {
  const parameters = args.join(', ');
  console.log(`第三个监听器中的事件有参数 ${parameters}`);
});

console.log(myEmitter.listeners('event'));

myEmitter.emit('event', 1, 2, 3, 4, 5);

// Prints:
// [
//   [Function: firstListener],
//   [Function: secondListener],
//   [Function: thirdListener]
// ]
// 第一个监听器
// 第二个监听器中的事件有参数 1、2
// 第三个监听器中的事件有参数 1, 2, 3, 4, 5
ログイン後にコピー
this が指す

を渡します。

eventEmitter.emit() このメソッドは、リスナーに任意の数のパラメータを渡すことができます。 this キーワードは、リスナーにバインドされた EventEmitter インスタンスを指します

const myEmitter = new MyEmitter();
myEmitter.on('event', function(a, b) {
  console.log(a, b, this, this === myEmitter);
  // 打印:
  //   a b MyEmitter {
  //     domain: null,
  //     _events: { event: [Function] },
  //     _eventsCount: 1,
  //     _maxListeners: undefined } true
});
myEmitter.emit('event', 'a', 'b');
ログイン後にコピー
ES6 のアロー関数をリスナーとして使用することもできます。ただし、

this キーワードは EventEmitter インスタンスを指しません。

const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
  console.log(a, b, this);
  // 打印: a b {}
});
myEmitter.emit('event', 'a', 'b');
ログイン後にコピー
非同期呼び出し

EventEmitter すべてのリスナーを登録順に同期的に呼び出します。イベントの正しい順序を確保するために、リスナーは setImmediate() メソッドと process.nextTick() メソッドを使用して、非同期操作モード

const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
  setImmediate(() => {
    console.log('异步地发生');
  });
});
myEmitter.emit('event', 'a', 'b');
ログイン後にコピー
Event に切り替えることができます。 offloading

Node.js には、イベント バインディングをアンインストールするためのメソッドがいくつか用意されています。


#off/removeListener

off メソッドは、removeListener メソッドのエイリアスであり、クリーンアップするために使用されます。 up イベント バインディング

emiter.removeListener(eventName,listener)

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">const callback = (stream) =&gt; {   console.log('已连接'); }; server.on('connection', callback); // ... server.removeListener('connection', callback);</pre><div class="contentsignin">ログイン後にコピー</div></div>removeListener() は、リスナー配列から最大 1 つのリスナーのみを削除します。指定されたeventNameのリスナー配列にリスナーが複数回追加された場合は、removeListener()を複数回呼び出して、すべてのインスタンスを削除する必要があります。 ([eventName])

指定されたeventNameイベントのリスナーを削除します。eventNameが指定されていない場合は、イベントオブジェクトのすべてのリスナーを削除します。
emitter.eventNames()

const EventEmitter = require('events');
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});

myEE.eventNames().forEach(eventName => myEE.removeAllListeners);
ログイン後にコピー

を通じてイベント オブジェクトのeventName配列を取得できます。プログラミング関連の知識の詳細については、

プログラミング ビデオをご覧ください。 !

以上がNode.jsのイベントの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート