NodeJS EventEmitter事件機制

ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ(如果調試程序是移除 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)}`);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章