Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Erläuterung der Ereignisse in Node.js

Detaillierte Erläuterung der Ereignisse in Node.js

青灯夜游
青灯夜游nach vorne
2020-12-01 17:34:013032Durchsuche

Detaillierte Erläuterung der Ereignisse in Node.js

Verwandte Empfehlungen: „nodejs Tutorial

Das Frontend ist definitiv kein Unbekannter für Ereignisse. Es bindet das Scroll-Ereignis an das Fenster

window.addEventListener('scroll', ev => {
	console.log(ev);
});

Node.js Die meisten asynchronen Vorgänge sind ereignisgesteuert Objekte, die Ereignisse auslösen können, erben die Klasse EventEmitter
EventEmitter 类

事件监听

on

Node.js 事件监听使用和 jQuery API 非常类似emitter.on(eventName, listener)

const ee = new EventEmitter();
ee.on('foo', () => console.log('a'));
  1. EventEmitter 实例会维护一个 listener 数组,每次 listener 默认会被添加到数组尾部
  2. 每次添加 listener 不会检查是否添加过,多次调用 on 传入相同的 eventName 和 listener,会导致 listener 被添加多次

prependListener

emitter.prependListener(eventName, listener) 
通过 prependListener 可以把 listener 添加到 listener 数组头部

const ee = new EventEmitter();
ee.prependListener('foo', () => console.log('a'));

once

如果希望 listener 被触发一次后就不再触发,可以使用 once 来绑定事件

const ee = new EventEmitter();
ee.once('foo', () => console.log('a'));

事件触发

emitter.emit(eventName[, ...args])
在浏览器环境中开发者事件相关的大部分工作是订阅事件,也就是绑定事件处理函数 listener,在 Node.js 事件编程中经常需要创建事件对象,在合理实际触发事件。使用 emit 方法可以按照 listener 注册的顺序,同步地调用每个注册到名为 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() 方法可以传任意数量的参数到 listener, this 关键词会被指向 listener 所绑定的 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 以注册的顺序同步地调用所有 listener,这样可以确保事件的正确排序,listener 可以使用 setImmediate()process.nextTick() 方法切换到异步的操作模式

const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
  setImmediate(() => {
    console.log('异步地发生');
  });
});
myEmitter.emit('event', 'a', 'b');

事件卸载

Node.js 提供了几种卸载事件绑定的方法

off/removeListener

off 方法是 removeListener 方法的别名,用于清理事件绑定 emitter.removeListener(eventName, listener)

const callback = (stream) => {
  console.log('已连接');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);

removeListener() 最多只会从监听器数组中移除一个监听器。 如果监听器被多次添加到指定 eventName 的监听器数组中,则必须多次调用 removeListener() 才能移除所有实例

removeAllListeners

emitter.removeAllListeners([eventName]) 
移除指定的 eventName 事件的 listener,如果没有指定 eventName,则移除事件对象的所有 listener。可以通过 emitter.eventNames()

event listen

on

Node.js-Ereignisüberwachung wird verwendet. Sehr ähnlich zur jQuery-API. emitter.on(eventName, listener)

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

myEE.eventNames().forEach(eventName => myEE.removeAllListeners);
  1. Die EventEmitter-Instanz verwaltet ein Listener-Array und jeder Listener wird hinzugefügt standardmäßig am Ende des Arrays
  2. Jedes Mal, wenn ein Listener hinzugefügt wird, wird nicht überprüft, ob er bereits zuvor hinzugefügt wurde. Ein mehrmaliger Aufruf und die Übergabe desselben Ereignisnamens und Listeners führt dazu, dass der Listener dies tut mehrfach hinzugefügt werden

prependListener

emitter.prependListener(eventName, listener)
Verwenden Mit prependListener können Sie den Listener zum Kopf des Listener-Arrays hinzufügen Binden Sie das Ereignis
rrreee

Event Trigger

emitter.emit(eventName [, ...args])
Der größte Teil des Entwicklerereignisses Die damit verbundene Arbeit in der Browserumgebung besteht darin, Ereignisse zu abonnieren, dh den Listener der Ereignisverarbeitungsfunktion zu binden, was häufig in der Ereignisprogrammierung von Node.js erfolgt. Es muss ein Ereignisobjekt erstellt werden, um das Ereignis tatsächlich sinnvoll auszulösen. Verwenden Sie die Methode „emit“, um jeden für das Ereignis namens „eventName“ registrierten Listener synchron in der Reihenfolge aufzurufen, in der der Listener registriert ist, und übergeben Sie die bereitgestellten Parameter🎜rrreee

this verweist auf

🎜eventEmitter.emit()-Methode kann eine beliebige Anzahl von Parametern an den Listener übergeben. Das Schlüsselwort this verweist auf die EventEmitter-Instanz, auf die Der Listener ist gebunden. 🎜rrreee🎜Sie können auch ES6-Pfeilfunktionen als Listener verwenden. Aber das Schlüsselwort this verweist nicht auf die EventEmitter-Instanz: 🎜rrreee

Asynchronous call

🎜EventEmitter wird synchron in aufgerufen registrierte Reihenfolge Alle Listener, dies kann die korrekte Reihenfolge der Ereignisse sicherstellen. Der Listener kann die Methoden setImmediate() und process.nextTick() verwenden, um in den asynchronen Betriebsmodus zu wechseln rrreee

Event unloading

🎜Node.js bietet mehrere Methoden zum Deinstallieren der Ereignisbindung
🎜

off/removeListener

🎜off-Methode ist der RemoveListener-Alias ​​der Methode, die zum Bereinigen von Ereignisbindungen verwendet wird. emitter.removeListener(eventName, listener)🎜rrreee🎜removeListener() entfernt höchstens einen Listener aus dem Listener-Array. Wenn ein Listener dem Listener-Array für einen angegebenen Ereignisnamen mehrmals hinzugefügt wird, muss „removeListener()“ mehrmals aufgerufen werden, um alle Instanzen zu entfernen
🎜

removeAllListeners

🎜 emitter.removeAllListeners([eventName])
Entfernen Sie den Listener des angegebenen eventName-Ereignisses. Wenn eventName nicht angegeben ist, entfernen Sie alle Listener des Ereignisobjekts. Sie können das EventName-Array für das Event-Objekt über emitter.eventNames() abrufen. 🎜rrreee🎜Weitere Programmierkenntnisse finden Sie unter: 🎜Programmiervideo🎜! ! 🎜

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Ereignisse in Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen