Heim > Artikel > Web-Frontend > 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
类
Node.js 事件监听使用和 jQuery API 非常类似emitter.on(eventName, listener)
const ee = new EventEmitter(); ee.on('foo', () => console.log('a'));
emitter.prependListener(eventName, listener)
通过 prependListener 可以把 listener 添加到 listener 数组头部
const ee = new EventEmitter(); ee.prependListener('foo', () => console.log('a'));
如果希望 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
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 方法的别名,用于清理事件绑定 emitter.removeListener(eventName, listener)
const callback = (stream) => { console.log('已连接'); }; server.on('connection', callback); // ... server.removeListener('connection', callback);
removeListener() 最多只会从监听器数组中移除一个监听器。 如果监听器被多次添加到指定 eventName 的监听器数组中,则必须多次调用 removeListener() 才能移除所有实例
emitter.removeAllListeners([eventName])
移除指定的 eventName 事件的 listener,如果没有指定 eventName,则移除事件对象的所有 listener。可以通过 emitter.eventNames()
emitter.on(eventName, listener)
const EventEmitter = require('events'); const myEE = new EventEmitter(); myEE.on('foo', () => {}); myEE.on('bar', () => {}); myEE.eventNames().forEach(eventName => myEE.removeAllListeners);
emitter.prependListener(eventName, listener)
emitter.emit(eventName [, ...args])
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: 🎜rrreeeEventEmitter
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 rrreeeemitter.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 emitter.removeAllListeners([eventName])
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!