Node.js V6.9.4
Node.js核心API的大部份是圍繞1個(gè)異步事件驅(qū)動(dòng)架構(gòu)構(gòu)建的,因此Events模塊是很多模塊的基礎(chǔ),很多模塊都是基于Events模塊建立的,
例如:net.Server對(duì)象每當(dāng)對(duì)等體連接到它時(shí)發(fā)出1個(gè)事件; fs.ReadStream在打開(kāi)文件時(shí)發(fā)失事件; 每當(dāng)數(shù)據(jù)可用于讀取時(shí),流發(fā)失事件。
所有發(fā)失事件的對(duì)象都是EventEmitter類的實(shí)例。這些對(duì)象公然了1個(gè)EventEmitter.on()函數(shù),它允許1個(gè)或多個(gè)函數(shù)附加到對(duì)象發(fā)出的命名空間。
我們可以為1個(gè)事件對(duì)象注冊(cè)多個(gè)事件,可以為1個(gè)事件注冊(cè)多個(gè)監(jiān)聽(tīng)器
1.Events模塊基本用法
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => { //注冊(cè)1個(gè)名為'event'的事件
console.log('an event occurred!');
});
//觸發(fā)名為'event'的事件
myEmitter.emit('event'); // => 'an event occurred!'
2.同步與異步
* EventEmitter依照事件的注冊(cè)順序同步的調(diào)用監(jiān)聽(tīng)器,如果想切換到異步模式,使用setImmediate()或process.nextTick() *
const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
setImmediate(() => {
console.log('this happens asynchronously'); // 該事件會(huì)異步觸發(fā)
});
});
myEmitter.emit('event', 'a', 'b');
3.Error events
* 當(dāng)事件隊(duì)列中產(chǎn)生毛病或沒(méi)有為毛病事件注冊(cè)監(jiān)聽(tīng)器,則利用會(huì)拋出1個(gè)’error’事件,并且程序會(huì)退出 *
const myEmitter = new MyEmitter();
myEmitter.emit('error', new Error('whoops!')); // 拋出毛病并且程序退出
* 避免拋出毛病時(shí),進(jìn)程崩潰,可以為進(jìn)程注冊(cè)1個(gè)uncaughtException事件,用來(lái)處理毛病,避免程序崩潰 *
const myEmitter = new MyEmitter();
process.on('uncaughtException', (err) => {
console.log('whoops! there was an error');
});
//進(jìn)程不會(huì)崩潰
myEmitter.emit('error', new Error('whoops!')); // => 'whoops! there was an error'
* 最好實(shí)踐:應(yīng)當(dāng)始終為監(jiān)聽(tīng)器注冊(cè)1個(gè)’error’事件 *
const myEmitter = new MyEmitter();
myEmitter.on('error', (err) => {
console.log('whoops! there was an error');
});
myEmitter.emit('error', new Error('whoops!')); // => 'whoops! there was an error'
4.Event經(jīng)常使用API介紹
* const EventEmitter = require(‘events’) *
* const myEE = new EventEmitter() *
方法 | 作用 |
---|---|
myEE.on(‘eventName’, listener) | 為當(dāng)前實(shí)例對(duì)象的某個(gè)事件注冊(cè)監(jiān)聽(tīng)器 |
myEE.emit(eventName[, …args]) | 順序觸發(fā)當(dāng)前實(shí)例對(duì)象某個(gè)事件的所有監(jiān)聽(tīng)器 |
myEE.once(eventName, listener) | 設(shè)置當(dāng)前實(shí)例對(duì)象的某個(gè)事件的監(jiān)聽(tīng)器只觸發(fā)1次 |
myEE.addListener(eventName, listener) | 為當(dāng)前實(shí)例對(duì)象的某個(gè)事件增加監(jiān)聽(tīng)器 |
myEE.eventNames() | 返回當(dāng)前實(shí)例對(duì)象的所有的注冊(cè)事件(按注冊(cè)順序) |
myEE.getMaxListeners() | 返回當(dāng)前實(shí)例對(duì)象可以設(shè)置的最大監(jiān)聽(tīng)器數(shù)量 |
myEE.listenerCount(eventName) | 返回當(dāng)前實(shí)例對(duì)象的某個(gè)事件的監(jiān)聽(tīng)器數(shù)量 |
myEE.listeners(eventName) | 以數(shù)組情勢(shì)返回當(dāng)前實(shí)例對(duì)象的某個(gè)事件的所有監(jiān)聽(tīng)器 |
myEE.removeAllListeners([eventName]) | 刪除當(dāng)前對(duì)象的某個(gè)事件的所有監(jiān)聽(tīng)器 |
myEE.removeListener(eventName, listener) | 刪除當(dāng)前對(duì)象的某個(gè)事件的某個(gè)監(jiān)聽(tīng)器 |
myEE.setMaxListeners(n) | 設(shè)置監(jiān)聽(tīng)器的最大數(shù)量 |