[github地址:https://github.com/ABCDdouyae...]git
事件触发器
基本用法:
实例化一个监听器,注册监听事件‘event’,当经过emit触发‘event’时候,会调用回调函数github
const EventEmitter = require('events'); class MyEmitter extends EventEmitter{} const myEmitter = new MyEmitter(); myEmitter.on('event', ()=>{ console.log('触发事件') }); myEmitter.emit('event');
myEmitter.on('event1', function(a ,b){ console.log(a, b, this)//1 2 MyEmitter{} }); myEmitter.emit('event1', 1, 2);
也可使用 ES6 的箭头函数做为监听器。但 this 关键词不会指向 EventEmitter 实例:数组
myEmitter.on('event', (a, b) => { console.log(a, b, this); // 打印: a b {} }); myEmitter.emit('event', 'a', 'b');
let m = 0; myEmitter.once('event', () => { console.log(++m); }); myEmitter.emit('event'); // 打印: 1 myEmitter.emit('event'); // 不触发
myEmitter.emit('error', new Error('错误信息')); // 抛出错误
做为最佳实践,应该始终为 'error' 事件注册监听器。架构
myEmitter.on('error', (err) => { console.error('错误信息'); }); myEmitter.emit('error', new Error('错误信息')); // 打印: 错误信息
const EventEmitter = require('events');
当新增监听器时,会触发 'newListener' 事件;当移除已存在的监听器时,则触发 'removeListener' 事件。app
newListener
的参数分别为增长的监听事件和该事件的句柄函数异步
myEmitter.once('newListener', (event, listener)=>{ console.log(event, listener)// 'event1' fn }); function fn(){ console.log(1) } myEmitter.on('event1', fn)
在添加监听器以前触发 'newListener' 事件有一个反作用: 若是在回调中注册同名事件的监听器,则该监听器会被插入到正被添加的监听器前面。函数
const myEmitter = new MyEmitter(); // 只处理一次,避免无限循环。 myEmitter.once('newListener', (event, listener) => { if (event === 'event') { // 在前面插入一个新的监听器。 myEmitter.on('event', () => { console.log('B'); }); } }); myEmitter.on('event', () => { console.log('A'); }); myEmitter.emit('event'); // 打印: // B // A
removeListener
的参数分别为移除的监听事件和该事件的句柄函数ui
emitter.setMaxListeners(n)
方法改变单个 EventEmitter
实例的限制。 可使用 EventEmitter.defaultMaxListeners
属性改变全部 EventEmitter
实例的默认值。设置 EventEmitter.defaultMaxListeners
要谨慎,由于会影响全部 EventEmitter
实例,包括以前建立的。 于是,优先使用 emitter.setMaxListeners(n)
而不是 `EventEmitter.defaultMaxListeners
。限制不是硬性的。 EventEmitter
实例能够添加超过限制的监听器,但会向 stderr
输出跟踪警告,代表检测到可能的内存泄漏。 对于单个 EventEmitter
实例,可使用 emitter.getMaxListeners()
和 emitter.setMaxListeners()
暂时地消除警告console.log(myEmitter.getMaxListeners())//10 myEmitter.setMaxListeners(11); function fn(){ console.log(1)//11个1 } for(var i=0;i<11;i++){ myEmitter.on('event1', fn) } myEmitter.emit('event1')
const EventEmitter = require('events'); const myEE = new EventEmitter(); myEE.on('foo', () => {}); myEE.on('bar', () => {}); const sym = Symbol('symbol'); myEE.on(sym, () => {}); console.log(myEE.eventNames()); // 打印: [ 'foo', 'bar', Symbol(symbol) ]
let fn1 = ()=>{}, fn2 = ()=>{}; myEmitter.on('foo', fn1); myEmitter.on('foo', fn2); console.log(myEmitter.listeners('foo')); //[ [Function: fn1], [Function: fn2] ]
let fn1 = ()=>{console.log(1)}, fn2 = ()=>{console.log(2)};//2 myEmitter.on('foo', fn1); myEmitter.on('foo', fn2); console.log(myEmitter.listeners('foo')); //[ [Function: fn1], [Function: fn2] ] myEmitter.off('foo', fn1); myEmitter.emit('foo');
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');