Node.js学习之事件模块Events的使用示例
Node.js中的事件驱动模型基本上是所有I/O操作的基础。EventEmitter是Node.js的核心模块之一,它提供了事件处理的接口,可以用于自定义事件,或者处理Node.js内部提供的事件。
事件模块Events的基础使用
继承EventEmitter
我们可以用ES6的方式继承Node.js提供的EventEmitter类来创建自己的自定义事件。代码如下:
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('触发了一个事件!');
});
myEmitter.emit('event');
上述代码中,我们先定义了一个MyEmitter类,用以继承EventEmitter类。然后我们创建了自己的实例对象myEmitter,添加一个名为"event"的事件,并在该事件下绑定一个回调函数打印控制台。最后我们调用emit方法触发该事件。
EventEmmiter.on(eventName,listener)方法
on方法用于绑定事件处理函数,可以对一个事件绑定多个处理函数,所有的处理函数会按照添加的顺序依次执行。示例代码如下:
const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.on('event', () => console.log('处理函数一'));
emitter.on('event', () => console.log('处理函数二'));
emitter.emit('event');
我们创建了一个事件event,并在该事件上绑定了两个处理函数。最后使用emit方法来触发事件,输出结果为:
处理函数一
处理函数二
事件模块Events的实际应用
现在我们来结合一些常见的场景来看下如何使用Events模块。
例子一: EventEmitter模拟用户登录登出时的事件
假设我们正在开发一个网站,需要记录用户的登录和登出时间。这时候我们可以使用EventEmitter来模拟一个用户登录登出的事件,代码如下:
const EventEmitter = require('events');
const emitter = new EventEmitter();
const userList = [
{ name: '张三', isLogin: false },
{ name: '李四', isLogin: false },
{ name: '王五', isLogin: false },
];
function login(name) {
const user = userList.find(user => user.name === name);
if (user) {
if (!user.isLogin) {
user.isLogin = true;
emitter.emit('login', name + '已登录');
} else {
console.log(name + '已经登录');
}
} else {
console.log('查无此人');
}
}
function logout(name) {
const user = userList.find(user => user.name === name);
if (user) {
if (user.isLogin) {
user.isLogin = false;
emitter.emit('logout', name + '已登出');
} else {
console.log(name + '未登录');
}
} else {
console.log('查无此人');
}
}
emitter.on('login', msg => console.log(msg));
emitter.on('logout', msg => console.log(msg));
login('张三');
login('张三');
logout('张三');
logout('李四');
logout('王五');
代码中,我们定义了一个userList数组对象来模拟用户列表数据,包含用户姓名和登录状态等信息。下面,我们定义两个函数login和logout用于登录登出操作。当用户登录成功时,通过emit方法触发login事件并输出一条信息。当用户登出成功时,通过emit方法触发logout事件并输出一条信息。最后,我们通过on方法监听login和logout事件,打印出事件的输出结果。
执行上面的代码,输出结果为:
张三已登录
张三已经登录
张三已登出
李四未登录
王五未登录
这样,我们就可以很方便地监控用户的登录状态,并做出相应的操作。
例子二: EventEmitter模拟文件传输进度的事件
这个例子演示了如何使用EventEmitter来模拟在文件传输中使用的进度条。代码如下:
const EventEmitter = require('events');
const emitter = new EventEmitter();
function uploadFile() {
const file = { size: 1000, uploaded: 0 };
const timer = setInterval(() => {
if (file.uploaded >= file.size) {
clearInterval(timer);
emitter.emit('end', `上传完毕,共上传${file.size}kB`);
} else {
emitter.emit('progress', `已上传${file.uploaded}kB`);
file.uploaded += 100;
}
}, 1000);
}
emitter.on('progress', msg => console.log(msg));
emitter.on('end', msg => console.log(msg));
uploadFile();
这段代码中,我们定义了一个文件对象file,包含文件大小和已上传的大小。接着我们使用一个定时器来模拟文件上传的进度,并通过emit方法监听progress和end事件。当文件上传结束后,我们通过emit方法触发end事件,告知用户文件上传已完成。
执行代码,会看到类似如下的输出:
已上传0kB
已上传100kB
已上传200kB
已上传300kB
已上传400kB
已上传500kB
已上传600kB
已上传700kB
已上传800kB
已上传900kB
上传完毕,共上传1000kB
这样,我们就可以很方便地实现一个文件上传的进度条了。
以上就是本次Node.js学习之事件模块Events的使用示例的完整攻略。在实际开发中,我们可以基于Events模块开发许多不同的功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node.js学习之事件模块Events的使用示例 - Python技术站