node.js从入门到放弃
发布在全栈开发工程师2018年11月6日view:7701BrettBat数据结构和算法React Native正则表达式缓存Mongodbweb框架IconFont闭包&作用域物理引擎Socket.ioVue.jsbackbonethree.jsClaralistManager.jshtml5设计稿react-nativethis编译与执行JavaScript原型j's插件j's插件前端工程面试HTMLCheyannewebpack支付宝小程序
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。

原文出自:https://www.cnblogs.com/yishifuping/archive/2018/10/15/9787536.html image.png 先来讲一个简单的实例

EventEmitter的实例,绑定一个监听器。用eventEmitter.on()的方法来进行注册一个监听器,eventEmitter.emit()方法来触发引用事件。

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}
//合并
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
 console.log('触发事件');
});
myEmitter.emit('event');

EventEmitter 会按照监听器注册的顺序同步地调用所有监听器。 所以必须确保事件的排序正确,且避免竞态条件。 可以使用 setImmediate() 或 process.nextTick() 切换到异步模式:

const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
 setImmediate(() => {
 console.log('异步进行');
 });
});
myEmitter.emit('event', 'a', 'b');

 eventEmitter.on()与eventEmitter.onec()的区别,最明显的区别就是,他们后面的拼写不一样,着实在的的,其实是他们的运行,其中一个能够只要进行触发就会一直运行下去,触发一次运行一次,还有一个是不管你触发多少次,他只运行第一次。用定时器很有意思,并且可以定义多个myEmitter,用newListener来插入。本次给大家推荐一个免费的学习群,里面概括移动应用网站开发,css,html,webpack,vue node angular以及面试资源等。 对web开发技术感兴趣的同学,欢迎加入Q群:864305860,不管你是小白还是大牛我都欢迎,还有大牛整理的一套高效率学习路线和教程与您免费分享,同时每天更新视频资料。 最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。

const myEmitter = new MyEmitter();
let m = 0;
myEmitter.once('event', () => {
 console.log(++m);
});
myEmitter.emit('event');
// 打印: 1
myEmitter.emit('event');
// 不触发

插入用法如下

myEmitter.once('newListener', (event, listener) => {<br>//插入的是event的,里面也可以去判断下,这个event是否全等另外一个event
 console.log('B');
});

 node.js中事件的发射器 ,也就是调取的东西在这

class EventEmitter {
 // 返回正在监听名为 eventName的事件的监听器数量
 static listenerCount(emitter: EventEmitter, type: string | number): number;

 // 每个事件 默认可注册监听器的最大数量
 static defaultMaxListeners: number;


 // 修改事件 监听器数量的限制
 setMaxListeners(n: number): this;

 // 调用指定名称事件的 所有监听器
 emit(type: string | number, ...args: any[]): boolean;

 // 添加listener 函数到名为 type 的事件监听器数组末尾
 addListener(type: string | number, listener: Listener): this;
 // addListener 方法的别名
 on(type: string | number, listener: Listener): this;

 // 添加一个单次listener 函数到名为 eventName的事件。下次触发eventName事件时,监听器会被移除,然后调用
 once(type: string | number, listener: Listener): this;

 // 从type 的事件监听器数组中移除指定的 listener
 removeListener(type: string | number, listener: Listener): this;

 // 移除全部或指定type的监听器
 removeAllListeners(type?: string | number): this;

 // 返回type事件下的监听器数组
 listeners(type: string | number): Listener[];

 // 返回type事件下监听器数量
 listenerCount(type: string | number): number;
}

其实node的实例,在每个方法下都有限制要注册多少个监听器的,可以用

EventEmitter.defaultMaxListeners来查看下,还可以通过更改他的数值来限定用多少个监听器。

console.log(EventEmitter.defaultMaxListeners)
//默认值10console.log(EventEmitter.defaultMaxListeners)
//默认值10

上面说了on和once的区别,现在又来了一个addListener,同样是添加监听事件的东西来看下他的使用方法

emitter.addListeners("add", ()=>{
 console.log(EventEmitter.defaultMaxListeners)

})
emitter.emit('add');
//10

可能细心的人发现了,这个方法和上面的又有什么分别呢,我能告诉,没有分别,就是拼的不一样罢了,来验证一下本次给大家推荐一个免费的学习群,里面概括移动应用网站开发,css,html,webpack,vue node angular以及面试资源等。 对web开发技术感兴趣的同学,欢迎加入Q群:864305860,不管你是小白还是大牛我都欢迎,还有大牛整理的一套高效率学习路线和教程与您免费分享,同时每天更新视频资料。 最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。

console.log(emitter.on == emitter.addListener)
//true

现在添加监听的事件有了,来看看删除监听事件

const EventEmitter = require('events');
const myEE = new EventEmitter();
const sss = () =>{
 console.log("aaa")
}
myEE.on('foo', sss);
myEE.on('bar', () => {});

myEE.removeListener('foo', sss)

console.log(myEE.listeners('foo'))
//[]

上面的例子就是删除掉了foo监听里的sss事件,看上面了例子发现一个不认识的方法,那就是console.log内的方法myEE.listeners(name)这又是啥东西,为啥打印他就能知道他方法内有没有删除呢

这个东西吧,其实就是node.js里面给的一种方法,他返回的是事件监听器里的副本,也就是相当于方法之类的。和他对应的还有一个那就是myEE.listenerCount(name) 他返回的就是这个事件中有多少的监听数量。

const EventEmitter = require('events');
const myEE = new EventEmitter();
myEE.on('bar', () => {});
myEE.on('bar', () => {});
myEE.on('bar', () => {});
myEE.listenerCount('bar')
console.log(myEE.listenerCount('bar'))
//3
myEE.listeners('foo')
console.log(myEE.listeners('bar'))
//[ [Function], [Function], [Function] ]

如过他要是多个不重名的方法应该怎么办呢,要怎么把他查出来,那就要用到这个方法了myEE.eventNames() 这个方法他能够直接的反应你代码用都有那些方法。

const EventEmitter = require('events');
const myEE = new EventEmitter();
const sss = () =>{
 console.log("aaa")
}
myEE.on('foo', sss);
myEE.on('bar', () => {});
console.log(myEE.eventNames());
//[ 'foo', 'bar' ]

移除监听事件上面的移除事件,是根据条件来进行移除某一条,某一个监听的,下面我们来把所有的监听全部干掉。

const EventEmitter = require('events');
const myEE = new EventEmitter();
const sss = () =>{
 console.log("aaa")
}
myEE.on('foo', sss);
myEE.on('bar', () => {});

myEE.removeAllListeners()

这样你不管console.log哪个监听他都是空的

const myEmitter = new MyEmitter();
const callbackA = () => {
 console.log('A');
 myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
 console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
myEmitter.emit('event');
//????
myEmitter.emit('event');
//???

最后来说一下,封装监听器,其实理解了上面的这个就不是很难了主要还是一个方法的问题emitter.rawListeners(eventName) 这个方法的使用

const emitter = new EventEmitter();
emitter.once('log', () => console.log('只记录一次'));
// 返回一个数组,包含了一个封装了 `listener` 方法的监听器。
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// 打印 “只记录一次”,但不会解绑 `once` 事件。
logFnWrapper.listener();
// 打印 “只记录一次”,且移除监听器。
logFnWrapper();
emitter.on('log', () => console.log('持续地记录'));
// 返回一个数组,只包含 `.on()` 绑定的监听器。
const newListeners = emitter.rawListeners('log');
// 打印两次 “持续地记录”。
newListeners[0]();
emitter.emit('log');

原文出自:https://www.cnblogs.com/yishifuping/archive/2018/10/15/9787536.html

评论
发表评论
3个月前

谢谢楼主分享好贴! 我给大家推荐系列node.js视频教程 http://www.sucaihuo.com/video/224-0-0

WRITTEN BY
前端攻城小牛
你所谓的稳定不过是在浪费生命
TA的新浪微博
PUBLISHED IN
全栈开发工程师

往前端这条不归路再次迈进