[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');