You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository has been archived by the owner on Nov 30, 2024. It is now read-only.
在
js
的世界中,事件处理随处可见,这种处理模式就是观察者模式。这种模式会让对象和对象之间建立一种依赖关系,当一个对象改变后,将会通知其他对象进行响应。在
js
中可以应用在异步处理中,在事件回调函数中触发事件,在外部监听处理事件,来避免回调函数的嵌套。nodejs
中的events
模块就是一个观察者模式的实现。对于一个基本的
eventEmitter
对象,应该有添加事件监听的方法、移除事件监听的方法和触发某一个事件的方法,在此基础上,这里再添加一个方法用来实现监听只会被触发一次的方法。addEventListener(eventName, listener [, prepend])
removeEventListener(eventName, listener)
once(eventName, listener)
emit(eventName, ...args)
下面代码使用
es6
实现,简洁一点。使用 class 声明一个 EventEmitter
构造函数里面只有一个属性的初始化,
events
属性就来存放事件和处理方法的映射关系。addEventListener
removeEventListener
listener
在队列中过滤掉。e.origin !== listener
比较方式,这里主要是为了兼容once
函数添加的监听,往下看就明白了。once
使用
once
函数添加的事件监听处理函数,只会被触发一次,也就是当调用一次之后就自动移除掉。removeEventListener
方法来进行手动移除处理方法。注意这里,如果没有使用箭头函数,是需要将当前的this
绑定到cb
函数中。cb
函数的origin
属性指向listener
,看到这里,就可以知道为什么removeEventListener
要多一个条件判断,因为这里使用addEventListener
添加的listener
并不是原始的处理函数,而是封住一次的另外一个函数,通过origin
这个属性,我们才能在removeEventListener
函数中识别对应的处理函数。emit
触发事件就是将对象事件的处理队列遍历的调用一遍,这里注意
this
的指向和参数的传递。小结
观察者模式相对比较简单,当然还有很多其他扩展方法,这里就先不说了,了解主要思想最重要。重点在于怎么去维护好对应的事件队列。
The text was updated successfully, but these errors were encountered: