node.js常用内置模块--Events

2020-12-16  本文已影响0人  31313_iOS

大部分Node.js核心API是围绕一个惯用的异步事件驱动体系结构构建的,在这种体系结构中,某些类型的对象(称为“发射器(emitters)”)发出命名事件,从而导致函数对象(“侦听器(listeners)”)被调用。

所有发出事件的对象都是EventEmitter类的实例。通常,事件名称是大小写为驼峰大小写的字符串,但可以使用任何有效的JavaScript属性键。当EventEmitter对象发出事件时,所有附加到该特定事件的函数都将被同步调用。被调用的侦听器返回的任何值都将被忽略和丢弃。

下面通过一些例子来了解EventEmitter对象的使用。更多的使用方法可以直接查看官网对于Events的介绍。

一、引入EventEmitter对象

const EventEmitter = require('events');

二、创建EventEmitter对象

// 创建EventEmitter对象
const emitter = new EventEmitter();

三、基本使用

1. 监听事件 emitter.on(eventName, listener)
// 监听click事件
emitter.on('click', (e) => {
   console.log('监听到了click点击', e); //监听到了click点击 { name: 'Click-Passer', age: 18 }
})
2.发送事件 emitter.emit(eventName[, ...args])

发送事件可以携带一些参数,下面的例子就是携带了{name: 'Click-Passer', age: 18}

setTimeout(() => {
   emitter.emit('click', {name: 'Click-Passer', age: 18})
}, 2000)
3.移除事件 emitter.off(eventName, listener)

它是v10.0.0增加的方法,是 emitter.removeListener()的别名

function b(e) {
   console.log('监听到了tap点击', e); //监听到了tap点击 { name: 'Tap-Passer', age: 28 }
}
//开始监听tap事件
emitter.on('tap', b)

//发送tap事件,并传送了参数 {name: 'Tap-Passer', age: 28}
//emitter.emit('tap')
emitter.emit('tap', {name: 'Tap-Passer', age: 28})

//移除事件
emitter.off('tap', b)

三、常见的属性

EventEmitter的实例有一些属性,可以获取相关的信息。

获取当前 EventEmitter对象注册的事件字符串数组。

const names = emitter.eventNames()
console.log(names);  //[ 'click', 'tap']

获取当前EventEmitter对象的最大监听器数量,默认10。

 const maxListeners = emitter.getMaxListeners()
 console.log(maxListeners); // 10

修改当前EventEmitter对象的最大监听器数量。

// 修改最大监听器数量
 emitter.setMaxListeners(30)

获取当前EventEmitter对象某个事件监听器上所有的监听器数组.

const listeners = emitter.listeners('click')
console.log(listeners); //[ [Function]]

//根据返回值方法也可以调用
 listeners[0](33) ; // //监听到了click点击 33

获取当前 EventEmitter对象某一个事件名称,监听器的个数;

   const clickCount = emitter.listenerCount('click')
   console.log(clickCount); // 1

四、其他常用方法

当前 EventEmitter对象的某一个监听事件只会监听一次。

emitter.once('once', (e) => {
   console.log('只监听一次的被调用了', e);
})

setTimeout(() => {
    emitter.emit('once', {name: 'Once-Passer', age: 38})
    emitter.emit('once', {name: 'Once-Passer'})
}, 2000)

当前 EventEmitter对象将某个监听事件添加到最前面 ,是对于相同eventName监听事件。

emitter.prependListener('click', (e) => {
   console.log('将监听事件添加到最前面', e);
})
setTimeout(() => {
   emitter.emit('click', {name: 'Click-Passer', age: 18})
},2000)
//将监听事件添加到最前面 { name: 'Click-Passer', age: 18 }
//监听到了click点击 { name: 'Click-Passer', age: 18 }

当前 EventEmitter对象将某个监听事件添加到最前面且只调用一次

emitter.prependOnceListener('click', (e) => {
   console.log('将监听事件添加到最前面且只监听一次', e);
})
setTimeout(() => {
   emitter.emit('click', {name: 'Click-Passer', age: 18})
},2000)

//将监听事件添加到最前面且只监听一次 { name: 'Click-Passer', age: 18 }
//将监听事件添加到最前面 { name: 'Click-Passer', age: 18 }
//监听到了click点击 { name: 'Click-Passer', age: 18 }

从输出可以看出,同一个eventName他们调用顺序 prependOnceListener -> prependListener -> on

当前 EventEmitter对象移除所有的监听器

//移除所有的监听器
emitter.removeAllListeners()

// 移除emitter上的click事件监听
emitter.removeAllListeners("click");

更多的使用方法可以直接查看官网对于Events的介绍。

上一篇下一篇

猜你喜欢

热点阅读