Nodejs EventEmitter解读

Nodejs EventEmitter解读

// 引入EventEmitter事件对象 var Events = require(“events”).EventEmitter;

// 设置全局所有已实例化EventEmitter事件对象的变量的可注册最大数,默认为:10个 Events.defaultMaxListeners = 20;

// 实例化EventEmitter事件对象 var event = new Events();

// 设置当前实例化EventEmitter事件对象的event变量的可注册最大数,默认为:10个 event.setMaxListeners(20);

// 注册事件监听addListener和on用法相同,但是它不会自动触发!需要手工调用emit方法来触发它们 event.addListener(“aaa”, function (value) { console.log("aaa事件,的参数: " + value.key); }); event.on(“bbb”, function (value) { console.log("bbb事件,的参数: " + value.key); }); event.emit(“aaa”, {key: “aaa”}); event.emit(“bbb”, {key: “bbb”});

// 注册一次性的事件监听,但是它不会自动触发! // 需要手工调用emit方法来触发它们,当在第一次触发时就立即删除了该事件 event.once(“ccc”, function (value) { console.log("ccc事件,的参数: " + value.key); }); event.emit(“ccc”, {key: “ccc”}); // 执行这行代码以后 ccc 事件就删除了

// 删除一个事件监听,使用removeListener方法, // 前提是这个事件的回调函数是赋值给变量的,然后删除时需要指明这个回调函数的变量! var callback = function (value) { console.log("ddd事件,的参数: " + value.key); } event.on(“ddd”, callback); event.removeListener(“ddd”, callback); // 执行这行代码以后 ddd 事件就删除了

// 使用listeners返回一个事件的回调函数(数组表示),也就是说之前用on注册时共实施了多少个callback event.on(“bbb”, callback); event.on(“bbb”, callback); console.log(event.listeners(“bbb”)); // 输出 [ [Function1], [Function2], [Function3] ]

// 使用listenerCount返回一个事件的回调函数总数,也就是说之前用on注册时共实施了多少个callback // 注意它必须是用EventEmitter类调用的,而不是用已实例化后的对象变量调用的 // 第一个参数是当前对象变量 // 第二个参数是已注册的事件名 console.log(Events.listenerCount(event, “bbb”)); // 输出 3

// 删除所有事件,或者指明一个事件名然后删除该事件,使用removeAllListeners, // 然而不需要像removeListener方法这样需要callback的依赖项删除事件 event.removeAllListeners(); // 删除所有以上注册的事件 event.removeAllListeners(“aaa”); // 删除以上注册的"aaa"事件

// 在已实例化的事件对象的变量调用以下的事件监听,则注定了这个对象的变量在每一次注册事件 // 如:on, once, addListener注册事件时都会自动触发"newListener"这个事件 // 回调函数接收的参数,第一个参数是注册时的事件名,第二个参数是注册时的回调函数(闭包) event.on(“newListener”, function (EventName, callback) { callback({on: EventName}); }); event.addListener(“aaa”, function (value) { console.log(“我是注册时自动触发的” + value.on + “事件!”); });

// 在已实例化的事件对象的变量调用以下的事件监听,则注定了这个对象的变量在每一次删除事件 // 如:removeListener, removeAllListeners删除事件时都会自动触发"removeListener"这个事件 // 回调函数接收的参数,第一个参数是删除时的事件名,第二个参数是删除时的回调函数(闭包) event.on(“removeListener”, function (EventName, callback) { callback({EventName: EventName}); }); var callbackName = function (value) { console.log(“我是删除事件时自动触发的” + value.EventName + “事件!”); } event.on(“ddd”, callbackName); event.removeListener(“ddd”, callbackName);

// 总结: // addListener和on方法返回当前注册的事件监听的总数与当前可设置的事件监听默认最大数(setMaxListeners) // once则同上,不同之处则对应的callback是对象表示的! // removeListener, removeAllListeners也是同上,只是返回删除后的事件监听的总数与默认最大数(setMaxListeners) // emit返回当调用已注册的事件成功返回true,否则返回false // addListener,on,once,removeListener,removeAllListeners支持链式调用, // 例子: var calls = function () { console.log(“a”); } event.addListener(“a”, calls) .on(“b”, function () { console.log(“b”); }).once(“c”, function (value) { console.log(value.name); }).removeListener(“a”, calls) .removeAllListeners(“b”).emit(“c”, { name: “看!我调用的是啥?” }); // emit 返回 true event = null; // 结束


2 回复

Nodejs EventEmitter 解读

EventEmitter 是 Node.js 中一个非常重要的模块,它实现了发布/订阅模式(Publish/Subscribe Pattern),允许对象之间进行异步通信。通过 EventEmitter,我们可以轻松地管理事件的注册、触发和移除。

示例代码及解释

首先,我们需要引入 EventEmitter 模块:

const EventEmitter = require('events').EventEmitter;

接下来,我们创建一个 EventEmitter 的实例,并设置一些配置:

// 设置全局所有已实例化EventEmitter事件对象的变量的可注册最大数,默认为:10个
EventEmitter.defaultMaxListeners = 20;

// 实例化EventEmitter事件对象
const event = new EventEmitter();

// 设置当前实例化EventEmitter事件对象的event变量的可注册最大数,默认为:10个
event.setMaxListeners(20);

事件监听器

EventEmitter 提供了多种方法来处理事件监听器的注册、触发和移除。以下是几个常用的方法及其用法:

注册事件监听器

// 注册事件监听addListener和on用法相同,但是它不会自动触发!需要手工调用emit方法来触发它们
event.on('aaa', function (value) {
    console.log('aaa事件,的参数: ' + value.key);
});

event.on('bbb', function (value) {
    console.log('bbb事件,的参数: ' + value.key);
});

触发事件

event.emit('aaa', { key: 'aaa' });
event.emit('bbb', { key: 'bbb' });

一次性事件监听器

// 注册一次性的事件监听,但是它不会自动触发!
// 需要手工调用emit方法来触发它们,当在第一次触发时就立即删除了该事件
event.once('ccc', function (value) {
    console.log('ccc事件,的参数: ' + value.key);
});
event.emit('ccc', { key: 'ccc' }); // 执行这行代码以后 ccc 事件就删除了

删除事件监听器

// 删除一个事件监听,使用removeListener方法,
// 前提是这个事件的回调函数是赋值给变量的,然后删除时需要指明这个回调函数的变量!
var callback = function (value) {
    console.log('ddd事件,的参数: ' + value.key);
}
event.on('ddd', callback);
event.removeListener('ddd', callback); // 执行这行代码以后 ddd 事件就删除了

查询事件监听器

// 使用listeners返回一个事件的回调函数(数组表示),也就是说之前用on注册时共实施了多少个callback
event.on('bbb', callback);
event.on('bbb', callback);
console.log(event.listeners('bbb')); // 输出 [ [Function1], [Function2], [Function3] ]

// 使用listenerCount返回一个事件的回调函数总数,也就是说之前用on注册时共实施了多少个callback
// 注意它必须是用EventEmitter类调用的,而不是用已实例化后的对象变量调用的
// 第一个参数是当前对象变量
// 第二个参数是已注册的事件名
console.log(EventEmitter.listenerCount(event, 'bbb')); // 输出 3

删除所有事件

// 删除所有事件,或者指明一个事件名然后删除该事件,使用removeAllListeners,
// 然而不需要像removeListener方法这样需要callback的依赖项删除事件
event.removeAllListeners();        // 删除所有以上注册的事件
event.removeAllListeners('aaa');   // 删除以上注册的"aaa"事件

特殊事件

EventEmitter 还提供了一些特殊事件,用于在特定情况下触发:

newListener 事件

// 在已实例化的事件对象的变量调用以下的事件监听,则注定了这个对象的变量在每一次注册事件
// 如:on, once, addListener注册事件时都会自动触发"newListener"这个事件
// 回调函数接收的参数,第一个参数是注册时的事件名,第二个参数是注册时的回调函数(闭包)
event.on('newListener', function (EventName, callback) {
    callback({ on: EventName });
});
event.on('aaa', function (value) {
    console.log('我是注册时自动触发的' + value.on + '事件!');
});

removeListener 事件

// 在已实例化的事件对象的变量调用以下的事件监听,则注定了这个对象的变量在每一次删除事件
// 如:removeListener, removeAllListeners删除事件时都会自动触发"removeListener"这个事件
// 回调函数接收的参数,第一个参数是删除时的事件名,第二个参数是删除时的回调函数(闭包)
event.on('removeListener', function (EventName, callback) {
    callback({ EventName: EventName });
});
var callbackName = function (value) {
    console.log('我是删除事件时自动触发的' + value.EventName + '事件!');
}
event.on('ddd', callbackName);
event.removeListener('ddd', callbackName);

链式调用

EventEmitter 的方法还支持链式调用,可以简化代码:

var calls = function () {
    console.log('a');
}

event.on('a', calls)
    .on('b', function () {
        console.log('b');
    })
    .once('c', function (value) {
        console.log(value.name);
    })
    .removeListener('a', calls)
    .removeAllListeners('b')
    .emit('c', {
        name: '看!我调用的是啥?'
    }); // emit 返回 true

通过这些方法,我们可以灵活地管理和控制事件的触发和监听。希望这些示例能帮助你更好地理解和使用 EventEmitter


Node.js EventEmitter 解读

EventEmitter 是 Node.js 中的一个核心模块,用于实现事件驱动编程。它允许对象间通过事件进行通信。下面将详细介绍如何使用 EventEmitter 及其常用方法。

示例代码

const EventEmitter = require('events').EventEmitter;

// 设置全局所有已实例化EventEmitter事件对象的最大监听器数量
EventEmitter.defaultMaxListeners = 20;

// 实例化EventEmitter对象
const eventEmitter = new EventEmitter();

// 设置当前实例化EventEmitter事件对象的最大监听器数量
eventEmitter.setMaxListeners(20);

// 添加事件监听器
eventEmitter.on('aaa', (value) => {
    console.log(`aaa事件,的参数: ${value.key}`);
});

eventEmitter.on('bbb', (value) => {
    console.log(`bbb事件,的参数: ${value.key}`);
});

// 触发事件
eventEmitter.emit('aaa', { key: 'aaa' });
eventEmitter.emit('bbb', { key: 'bbb' });

// 添加一次性事件监听器
eventEmitter.once('ccc', (value) => {
    console.log(`ccc事件,的参数: ${value.key}`);
});

eventEmitter.emit('ccc', { key: 'ccc' }); // ccc事件只会触发一次

// 删除事件监听器
const callback = (value) => {
    console.log(`ddd事件,的参数: ${value.key}`);
};
eventEmitter.on('ddd', callback);
eventEmitter.removeListener('ddd', callback);

// 获取事件的所有监听器
console.log(eventEmitter.listeners('bbb')); // 输出 [Function, Function]

// 获取特定事件的监听器数量
console.log(EventEmitter.listenerCount(eventEmitter, 'bbb')); // 输出 2

// 删除所有事件监听器或指定事件
eventEmitter.removeAllListeners();
eventEmitter.removeAllListeners('aaa');

// 监听新添加的事件监听器
eventEmitter.on('newListener', (eventName, listener) => {
    console.log(`新监听器已添加:${eventName} -> ${listener}`);
});

eventEmitter.on('aaa', (value) => {
    console.log(`我是注册时自动触发的${value}事件`);
});

// 监听移除的事件监听器
eventEmitter.on('removeListener', (eventName, listener) => {
    console.log(`事件监听器已移除:${eventName} -> ${listener}`);
});

const callbackName = (value) => {
    console.log(`我是删除事件时自动触发的${value.EventName}事件`);
};

eventEmitter.on('ddd', callbackName);
eventEmitter.removeListener('ddd', callbackName);

// 示例:链式调用
eventEmitter
    .on('a', () => console.log('a'))
    .on('b', () => console.log('b'))
    .once('c', (value) => console.log(value))
    .removeListener('a')
    .removeAllListeners('b')
    .emit('c', { name: '看!我调用的是啥?' }); // 输出:看!我调用的是啥?

解释

  • EventEmitter:是一个用于处理事件的类。
  • setMaxListeners():设置当前实例的最大监听器数量。
  • on()addListener():用于添加事件监听器,这两个方法功能相同。
  • once():用于添加一次性事件监听器,仅触发一次后自动移除。
  • emit():触发事件并执行所有绑定到该事件的监听器。
  • removeListener():移除特定事件的监听器。
  • removeAllListeners():移除所有监听器或指定事件的所有监听器。
  • listenerCount():获取特定事件的监听器数量。
  • newListenerremoveListener:分别是监听新添加的事件监听器和移除的事件监听器的事件。

通过这些方法,你可以灵活地管理事件的监听和触发,从而构建出更复杂的应用程序逻辑。

回到顶部