Api目錄
2、eventEmitter.defaultMaxListeners
5、emitter.prependListener(eventName, listener);
6、emitter.prependOnceListener(eventName, listener)
7、emitter.removeListener(eventName, listener)
8、emitter.removeAllListeners(eventName)
9、emitter.off(eventName, listener)
11、emitter.on('eventName', listener)
12、emitter.once('eventName', listener)
13、emitter.emit('eventName', params)
一、什么是事件模塊(events)
1、大多數Node.js核心Api都是采用慣用的異步事件驅動架構
2、所有能觸發事件的對象都是EventEmitter類的實例
3、事件流程:引入模塊 -> 實例化EventEmitter類 -> 注冊事件 -> 觸發事件
// 引入事件模塊 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
改變指定的單個 EventEmitter 實例的最大注冊數量; 值設為 Infinity(或 0)表示不限制監聽器的數量。
獲取單個實例最大監聽器數量
// 設置單個實例最大監聽器數量 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的別名
返回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,都是作者辛苦練習總結出來的,轉載需注明轉載地址,謝謝配合!
