ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ(如果調試程序是移除 bug 的過程,那編寫程序就是把 bug 放進來的過程。—— 迪傑 · 斯特拉)
ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ
EventEmitter
// NodeJS核心模塊之event
import { EventEmitter } from 'events';
const enum eventNameSpace {
GET = 'get', //
SOMEEVENT = 'soneEvent',
ONCE = 'once',
REMOVELISTENER = 'removeListener',
ERROR = 'error',
}
/**
* @description
* nodejs 所有的異步IO操作在完成時都會發送一個事件到事件隊列,並且node的很多內置核心模塊,都繼承了events
* 比如:fs.readStream對象會在文件被打開的時候觸發一個事件,而這個產生事件的對象就是EventEmitter實例
* 但在一般開發情況下,我們並不會直接使用EventEmitter,而是在對象中繼承它,包括fs,net,http在內的
* 只要是支持事件響應的核心模塊,都是EventEmitter的子類
*/
const event = new EventEmitter();
/**
* 我們使用on創建了一個事件監聽器,並進行監聽,然後使用emit向該事件通道發送事件
*/
event.on(eventNameSpace.GET, (data) => {
console.log(`收到get事件 ${data}`);
});
event.emit(eventNameSpace.GET, 'messages');
/**
* 每一個事件都由一個事件名和若干個事件參數組成
*/
event.on(eventNameSpace.SOMEEVENT, (arg1, arg2) => {
console.log(arg1, arg2);
});
event.on(eventNameSpace.SOMEEVENT, (arg1, arg2) => {
console.log(arg1, arg2);
});
event.emit(eventNameSpace.SOMEEVENT, '參數1', '參數2');
/**
* 錯誤處理監聽器,如果沒有爲error設置錯誤處理事件,則會導致node進程崩潰
* 建議爲每一個事件都監聽error
*/
event.on(eventNameSpace.ERROR, (error: string) => {
console.error(`打印錯誤信息:${error}`);
});
const error = true;
if (error) {
event.emit(eventNameSpace.ERROR, `發生錯誤了~~~`);
}
/**
* 獲取當前指定事件監聽器的數量
*/
console.log(`${eventNameSpace.SOMEEVENT}的數量爲:${event.listenerCount(eventNameSpace.SOMEEVENT)}`);
/**
* 設置事件最大監聽數,超出則警告
*/
// EventEmitter.defaultMaxListeners = 1;
// event.on(eventNameSpace.SOMEEVENT, (arg1, arg2) => {
// console.log(arg1, arg2);
// });
// event.on(eventNameSpace.SOMEEVENT, (arg1, arg2) => {
// console.log(arg1, arg2);
// });
/**
* 默認情況下每個事件最多可設置10個監聽器,我們可以使用setMaxListeners來設置和獲取同類型事件監聽最大數
* 官方不建議使用defaultMaxListeners直接改變默認監聽數量,因爲這樣可能會影響其他事件
*/
event.setMaxListeners(4);
console.log(`同類型事件監聽最大數是:${event.getMaxListeners()}`);
event.on(eventNameSpace.SOMEEVENT, (arg1, arg2) => {
console.log(arg1, arg2);
});
event.on(eventNameSpace.SOMEEVENT, (arg1, arg2) => {
console.log(arg1, arg2);
});
/**
* 同一事件監聽只執行一次 once
*/
event.once(eventNameSpace.ONCE, (arg1, arg2) => {
console.log(`${eventNameSpace.ONCE},${arg1},,${arg2}`);
});
event.emit(eventNameSpace.ONCE, '參數1', '參數2');
event.emit(eventNameSpace.ONCE, '參數1', '參數2');
/**
* 移除指定名稱的事件 removeListener 只能刪除最近的一次
*/
const removeHandle = (data: string) => console.log(`${data}事件被移除`);
event.on(eventNameSpace.REMOVELISTENER, removeHandle);
event.on(eventNameSpace.REMOVELISTENER, removeHandle);
event.on(eventNameSpace.REMOVELISTENER, removeHandle);
console.log(`${eventNameSpace.REMOVELISTENER}的數量爲:${event.listenerCount(eventNameSpace.REMOVELISTENER)}`);
event.removeListener(eventNameSpace.REMOVELISTENER, removeHandle);
console.log(`${eventNameSpace.REMOVELISTENER}的數量爲:${event.listenerCount(eventNameSpace.REMOVELISTENER)}`);
/**
* 刪除所有指定名稱的事件 removeAllListeners
*/
event.removeAllListeners(eventNameSpace.REMOVELISTENER);
console.log(`${eventNameSpace.REMOVELISTENER}的數量爲:${event.listenerCount(eventNameSpace.REMOVELISTENER)}`);