Node.js 事件觸發器詳細總結


Api目錄

  1、簡單的注冊、觸發事件的流程

  2、eventEmitter.defaultMaxListeners

  3、emitter.setMaxListeners(n)

  4、emitter.getMaxListeners(n)

  5、emitter.prependListener(eventName, listener);

  6、emitter.prependOnceListener(eventName, listener)

  7、emitter.removeListener(eventName, listener)

  8、emitter.removeAllListeners(eventName)

  9、emitter.off(eventName, listener)

  10、emitter.eventNames()

  11、emitter.on('eventName', listener)

  12、emitter.once('eventName', listener)

  13、emitter.emit('eventName', params)

 

一、什么是事件模塊(events)

1、大多數Node.js核心Api都是采用慣用的異步事件驅動架構

2、所有能觸發事件的對象都是EventEmitter類的實例

3、事件流程:引入模塊 -> 實例化EventEmitter類 -> 注冊事件 -> 觸發事件

 

二、舉例說明Api

1、簡單的注冊、觸發事件的流程

// 引入事件模塊
const eventEmitter= require('event').EventEmitter;

// 實例化EventEmitter類
let emitter = new eventEmitter();

// 注冊事件
emitter.on('someEvent', function(){
    console.log('觸發事件')
})

// 觸發事件
emitter.emit('someEvent')
// 打印:觸發事件

注:node.js官方文檔中,api的EventEmitter 和 emitter 在此所指:

a、所有 EventEmitter 對象指的就是 eventEmitter 對象

b、所有 emitter 實例,指的就是上面實例化的 emitter 對象

 

2、eventEmitter.defaultMaxListeners

EventEmitter下所有實例的可注冊監聽器個數的默認值. 默認是10個.(注:是改變EventEmitter下所有實例的);

console.log(eventEmitter.defaultMaxListeners);

//打印:10

 

3、emitter.setMaxListeners(n)

改變指定的單個 EventEmitter 實例的最大注冊數量; 值設為 Infinity(或 0)表示不限制監聽器的數量。

4、emitter.getMaxListeners(n)

獲取單個實例最大監聽器數量

// 設置單個實例最大監聽器數量
emitter.setMaxListeners(15);

// 獲取單個實例最大監聽器數量
let getMaxListeners = emitter.getMaxListeners();

console.log(getMaxListeners);
// 打印:15

 

5、emitter.prependListener(eventName, listener);

eventName: 已經注冊的監聽器名稱

listener: Function 回調

用來指定多個相同eventName的監聽器中,首先調用哪個listener回調.(原理是將指定監聽器,添加到監聽器數組的開頭,本質還是順序執行)

// test1 listener監聽方法
function test1 () { console.log('a') }

// test2 listener監聽方法
function test2 () { console.log('b') }

// 綁定foo事件
emitter.on('foo', test1);

// 將test2監聽器方法放在監聽器數組的頭部,首先執行
emitter.prependListener('foo', test2);

emitter.emit('foo')
// 打印:'b' 'a'

 

6、emitter.prependOnceListener(eventName, listener)

eventName: 已經注冊的監聽器名稱

listener: Function 回調

添加一個只能執行一次的eventName事件監聽器,下次再觸發時,當前監聽器會被先移除,然后在調用.

添加單次監聽器 listener 到名為 eventName 的事件的監聽器數組的開頭 ( 當 eventName 事件第二次觸發時,監聽器會先被移除,然后再調用。)

 

7、emitter.removeListener(eventName, listener)

從名為 eventName 的事件的監聽器數組中移除指定的 listener

// removeListener:刪除監聽器觸發
emitter.on("removeListener", function (event, listener) {
   console.log("移除了-" + event + "事件的" + listener "監聽器")
});

// 綁定test事件,並將tests作為test事件的listener
emitter.on("test", tests);
function tests(){
    console.log("測試事件")
};

// 觸發test事件
emitter.emit("test");

// 刪除test的事件監聽數組中的tests監聽器
emitter.removeListener("test", tests);

// 打印:
// 測試事件
// 移除了 test 事件的 tests 監聽器

 

8、emitter.removeAllListeners(eventName)

移除全部監聽器或指定的 eventName 事件的所有監聽器

// test1事件 只有一個監聽器
emitter.on("test1", function (data) {
    console.log(data)
});

// test2事件 只有一個監聽器
emitter.on("test2", function (data) {
    console.log(data)
});

// test3 事件有兩個監聽器 分別是 test3s 和 test3ss
emitter.on("test3", test3s);
emitter.on("test3", test3ss);
function test3s(data) {
    console.log(data)
}
function test3ss(data) {
    console.log(data)
}

// 移除監聽器觸發
emitter.on("removeListener", function (event, listener) {
    console.log("移除了-" + listener + "事件")
});

emitter.emit("test1", '1'); // 1
emitter.emit("test2", '2'); // 2
emitter.emit("test3", '3'); // 3 3

//移除test3下面所有的監聽器
emitter.removeAllListeners('test3'); // 第一次:移除了test3s 第二次:移除了test3ss 
emitter.emit("test1", '4'); // 4
emitter.emit("test2", '5'); // 5
emitter.emit("test3", '6'); // 無結果因為test3事件的監聽器全部移除了

 

9、emitter.off(eventName, listener)

removeListener的別名

 

10、emitter.eventNames()

返回emitter實例下已注冊的事件名數組。 數組中的值為字符串;

emitter.once('loadOnce', function () {
    console.log();
});

emitter.on('load', function () {
    console.log();
});

emitter.emit('load');
console.log(emitter.eventNames());
// 打印:[ 'loadOnce', 'load' ]

emitter.emit('loadOnce');
console.log(emitter.eventNames());
// 打印:['load' ]
// 原因: 因為once綁定的事件,執行一次之后就會移除。

 

11、emitter.on('eventName', listener)

eventName:事件名稱

listener:回調函數

注冊名稱為eventName、回調函數為listener的事件

 

12、emitter.once('eventName', listener)

注冊一次性名稱為eventName,回調函數為listener的事件

注意:只觸發一次,就會將其移除。

 

13、emitter.emit('eventName', params)

params:any 任意類型

觸發名稱為eventName的事件,按監聽器數組順序執行所有回調函數。

 

注意:以上nodejs事件的api,都是作者辛苦練習總結出來的,轉載需注明轉載地址,謝謝配合!

 

4、emitter.getMaxListeners(n)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM