Node.js入门笔记(8):Event

88 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

Node的Events模块只定义了一个类,就是EventEmitter(以下简称Event),这个类在很多Node本身以及第三方模块中大量使用,通常是用作基类被继承。

1.事件和监听器

使用方法 :类似于发布订阅,通过on确定监听事件,然后通过emit触发事件

//api
emmiter.on(eventName,listener)
//触发方法
var eventEmitter = require("events")
var myEmitter = new eventEmitter()
myEmitter.on("begin",function(){
    console.log('begin');
})
myEmitter.emit("begin") //begin

可以注册多个同名的事件,让我们来看一下效果,如果是同名事件拥有俩个触发事件

myEmitter.on("begin",function(){
    console.log('begin');
})
myEmitter.on("begin",function(){
    console.log('begin1');
})
myEmitter.emit("begin") //begin  begin1

2.获取事件

我们可以通过eventNames来获取当前注册了哪些事件,就算有注册了俩个同名事件,最后也会被过滤掉同名事件,比如下面实例只会输出begin begin2

myEmitter.on("begin",function(){
    console.log('begin');
})
myEmitter.on("begin",function(){
    console.log('begin1');
})
myEmitter.on("begin2",function(){
    console.log('begin2');
})
console.log(myEmitter.eventNames());//[ 'begin', 'begin2' ]

3.处理error事件

Node运行的环境是单线程环境,所以在运行中可能会因为出现错误而导致整个进程崩溃

myEmitter.on("begin",function(){
    console.log('begin1');
})
myEmitter.on("begin2",function(){
    console.log('begin2');
})
myEmitter.emit('begin')

myEmitter.emit('error',function(){ 
    console.log(666);
    
})
myEmitter.emit('begin2')

image.png

如果我们没用注册定义相对应的错误处理方法,可能会导致整个Node进程退出,我们可以看到当我们触发了error事件的时候,控制台会直接打印出整个错误栈,最后的一行代码也没有执行,这是我们不希望的事情,所以我们可以利用事件机制来实现错误处理功能。

使用uncaughtException事件捕获异常

myEmitter.on("begin2",function(){
    console.log('begin2');
})
myEmitter.emit('begin')
process.on("uncaughtException",function(){ 
    console.log('err');
}) 
throw new Error("err err")

image.png

4.继承Events模块 实际开发中我们可以用继承event模块的方式来使用,其实在Node的内部中,一些提供了事件机制的模块都是在继承event模块来进行使用的

var util = require('util');
var event = require('events');
function Player(){
    this.list = [1,2,3]
    event.call(this)
}
util.inherits(Player,event)
var player = new Player()
player.on('pause',()=>console.log(player.list));
player.on('play',()=>console.log(player.list.push(3)));
player.emit('play')
player.emit('pause')

比如我们在上面这个例子中,通过继承的方式声明一个函数去继承event事件模块,这样player中就可以用到event定义的监听方法,跟原生的event的使用方法一样。