node.js从入门到放弃(二)
2018-10-19 06:14:04来源:博客园 阅读 ()
上章讲了学习node,应该去学习什么,对这些框架去进行学习现在咋们聊聊如何用原生来进行操作
主要来讲一下events-事件触发器
先来讲一个简单的实例
EventEmitter的实例,绑定一个监听器。用eventEmitter.on()的方法来进行注册一个监听器,eventEmitter.emit()方法来触发引用事件。
//引入events模块 const EventEmitter = require('events'); //创建一个新实例 const myEmitter = new EventEmitter(); //创建一个监听 myEmitter.on('event', () => { console.log('触发事件'); }); //触发监听事件 myEmitter.emit('event');
区别
class MyEmitter { // 首先初始化对象的时候创建了一个事件的容器 constructor () { this.eventsPool = {} } // 添加事件监听器方法 将监听器添加到指定类型下的数组中 once (type, listener) { if (!this.eventsPool) { this.eventsPool = {} } if(!this.eventsPool[type]){ this.eventsPool[type]=[] } // >>> once 对listener 进行改造 const onceListener = (...args) => { let listeners = this.eventsPool[type] let lIndex = listeners.findIndex(listener => listener === onceListener) if (lIndex !== -1) { listeners.splice(lIndex, 1) } console.log("asfasf") listener.apply(this, args) } // >>> // >>> 将改造好的listener 放入监听器数组 this.eventsPool[type].push(onceListener) // console.log(this.eventsPool[type]) } addListener (type, listener) { if (!this.eventsPool) { this.eventsPool = {} } if(!this.eventsPool[type]){ this.eventsPool[type]=[] } this.eventsPool[type].push(listener) } // 触发事件方法 遍历类型下所有事件监听器并调用 emit (type, ...args) { let listeners = this.eventsPool[type] if (listeners) { for (let listener of listeners) { listener(args) } } } } const myEmitter = new MyEmitter() myEmitter.once('once', function() { console.log('once11111') }) myEmitter.addListener('once', function() { console.log('once') }) // myEmitter.emit('once') // myEmitter.emit('once') // myEmitter.emit('once')
来咋们来拆分下这段代码,require什么意思呢,可能是我不太懂,我找了一下 点击我进行查看→→→→
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来插入。
const myEmitter = new MyEmitter(); let m = 0;
myEmitter.once('event', () => { console.log(++m); }); myEmitter.emit('event'); // 打印: 1 myEmitter.emit('event'); // 不触发
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的实例,在每个方法下都有限制要注册多少个监听器的,可以用
console.log(EventEmitter.defaultMaxListeners) //默认值10
上面说了on和once的区别,现在又来了一个addListener,同样是添加监听事件的东西来看下他的使用方法
emitter.addListeners("add", ()=>{ console.log(EventEmitter.defaultMaxListeners) }) emitter.emit('add'); //10
可能细心的人发现了,这个方法和上面的又有什么分别呢,我能告诉,没有分别,就是拼的不一样罢了,来验证一下
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');
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- javascript面向对象入门基础详细介绍 2020-03-29
- Node.js中环境变量process.env的一些事详解 2020-01-17
- 详解node.js进行web开发的操作方法 2019-12-14
- 使用原生node.js搭建HTTP服务器,支持MP4视频、图片传输,支 2019-08-14
- 入门webpack,看这篇就够了 2019-08-14
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash