摘要:打印的參數(shù)分別為移除的監(jiān)聽事件和該事件的句柄函數(shù)默認(rèn)情況下,每個(gè)事件可以注冊(cè)最多個(gè)監(jiān)聽器。返回已注冊(cè)監(jiān)聽器的事件名數(shù)組。值設(shè)為或表示不限制監(jiān)聽器的數(shù)量。持續(xù)地記錄返回一個(gè)數(shù)組,只包含綁定的監(jiān)聽器。
[github地址:https://github.com/ABCDdouyae...]
events事件觸發(fā)器大多數(shù) Node.js 核心 API 構(gòu)建于慣用的異步事件驅(qū)動(dòng)架構(gòu),其中某些類型的對(duì)象(又稱觸發(fā)器,Emitter)會(huì)觸發(fā)命名事件來調(diào)用函數(shù)(又稱監(jiān)聽器,Listener)。所有能觸發(fā)事件的對(duì)象都是 EventEmitter 類的實(shí)例。 這些對(duì)象有一個(gè) eventEmitter.on() 函數(shù),用于將一個(gè)或多個(gè)函數(shù)綁定到命名事件上。 事件的命名通常是駝峰式的字符串。當(dāng) EventEmitter 對(duì)象觸發(fā)一個(gè)事件時(shí),所有綁定在該事件上的函數(shù)都會(huì)被同步地調(diào)用
基本用法:實(shí)例化一個(gè)監(jiān)聽器,注冊(cè)監(jiān)聽事件‘event’,當(dāng)通過emit觸發(fā)‘event’時(shí)候,會(huì)調(diào)用回調(diào)函數(shù)
const EventEmitter = require("events"); class MyEmitter extends EventEmitter{} const myEmitter = new MyEmitter(); myEmitter.on("event", ()=>{ console.log("觸發(fā)事件") }); myEmitter.emit("event");eventEmitter.emit() 方法可以傳任意數(shù)量的參數(shù)到監(jiān)聽器函數(shù)。 當(dāng)監(jiān)聽器函數(shù)被調(diào)用時(shí),this 關(guān)鍵詞會(huì)被指向監(jiān)聽器所綁定的 EventEmitter 實(shí)例。
myEmitter.on("event1", function(a ,b){ console.log(a, b, this)//1 2 MyEmitter{} }); myEmitter.emit("event1", 1, 2);
也可以使用 ES6 的箭頭函數(shù)作為監(jiān)聽器。但 this 關(guān)鍵詞不會(huì)指向 EventEmitter 實(shí)例:
myEmitter.on("event", (a, b) => { console.log(a, b, this); // 打印: a b {} }); myEmitter.emit("event", "a", "b");使用 eventEmitter.once() 可以注冊(cè)最多可調(diào)用一次的監(jiān)聽器。 當(dāng)事件被觸發(fā)時(shí),監(jiān)聽器會(huì)被注銷,然后再調(diào)用。
let m = 0; myEmitter.once("event", () => { console.log(++m); }); myEmitter.emit("event"); // 打印: 1 myEmitter.emit("event"); // 不觸發(fā)當(dāng) EventEmitter 實(shí)例出錯(cuò)時(shí),應(yīng)該觸發(fā) "error" 事件。如果沒有為 "error" 事件注冊(cè)監(jiān)聽器,則當(dāng) "error" 事件觸發(fā)時(shí),會(huì)拋出錯(cuò)誤、打印堆棧跟蹤、并退出 Node.js 進(jìn)程
myEmitter.emit("error", new Error("錯(cuò)誤信息")); // 拋出錯(cuò)誤
作為最佳實(shí)踐,應(yīng)該始終為 "error" 事件注冊(cè)監(jiān)聽器。
myEmitter.on("error", (err) => { console.error("錯(cuò)誤信息"); }); myEmitter.emit("error", new Error("錯(cuò)誤信息")); // 打印: 錯(cuò)誤信息EventEmitter 類由 events 模塊定義:
const EventEmitter = require("events");
當(dāng)新增監(jiān)聽器時(shí),會(huì)觸發(fā) "newListener" 事件;當(dāng)移除已存在的監(jiān)聽器時(shí),則觸發(fā) "removeListener" 事件。
newListener的參數(shù)分別為增加的監(jiān)聽事件和該事件的句柄函數(shù)
myEmitter.once("newListener", (event, listener)=>{ console.log(event, listener)// "event1" fn }); function fn(){ console.log(1) } myEmitter.on("event1", fn)
在添加監(jiān)聽器之前觸發(fā) "newListener" 事件有一個(gè)副作用: 如果在回調(diào)中注冊(cè)同名事件的監(jiān)聽器,則該監(jiān)聽器會(huì)被插入到正被添加的監(jiān)聽器前面。
const myEmitter = new MyEmitter(); // 只處理一次,避免無限循環(huán)。 myEmitter.once("newListener", (event, listener) => { if (event === "event") { // 在前面插入一個(gè)新的監(jiān)聽器。 myEmitter.on("event", () => { console.log("B"); }); } }); myEmitter.on("event", () => { console.log("A"); }); myEmitter.emit("event"); // 打印: // B // A
removeListener的參數(shù)分別為移除的監(jiān)聽事件和該事件的句柄函數(shù)
EventEmitter.defaultMaxListeners默認(rèn)情況下,每個(gè)事件可以注冊(cè)最多 10 個(gè)監(jiān)聽器。 可以使用 emitter.setMaxListeners(n) 方法改變單個(gè) EventEmitter 實(shí)例的限制。 可以使用 EventEmitter.defaultMaxListeners 屬性改變所有 EventEmitter 實(shí)例的默認(rèn)值。設(shè)置 EventEmitter.defaultMaxListeners 要謹(jǐn)慎,因?yàn)闀?huì)影響所有 EventEmitter 實(shí)例,包括之前創(chuàng)建的。 因而,優(yōu)先使用 emitter.setMaxListeners(n) 而不是 `EventEmitter.defaultMaxListeners。限制不是硬性的。 EventEmitter 實(shí)例可以添加超過限制的監(jiān)聽器,但會(huì)向 stderr 輸出跟蹤警告,表明檢測(cè)到可能的內(nèi)存泄漏。 對(duì)于單個(gè) EventEmitter 實(shí)例,可以使用 emitter.getMaxListeners() 和 emitter.setMaxListeners() 暫時(shí)地消除警告console.log(myEmitter.getMaxListeners())//10 myEmitter.setMaxListeners(11); function fn(){ console.log(1)//11個(gè)1 } for(var i=0;i<11;i++){ myEmitter.on("event1", fn) } myEmitter.emit("event1")emitter.addListener(eventName, listener), emitter.on(eventName, listener)的別名 emitter.emit(eventName[, ...args])按照監(jiān)聽器注冊(cè)的順序,同步地調(diào)用每個(gè)注冊(cè)到名為 eventName 的事件的監(jiān)聽器,并傳入提供的參數(shù)。如果事件有監(jiān)聽器,則返回 true,否則返回 false。 emitter.eventNames() 返回已注冊(cè)監(jiān)聽器的事件名數(shù)組。 數(shù)組中的值為字符串或 `Symbol。
const EventEmitter = require("events"); const myEE = new EventEmitter(); myEE.on("foo", () => {}); myEE.on("bar", () => {}); const sym = Symbol("symbol"); myEE.on(sym, () => {}); console.log(myEE.eventNames()); // 打印: [ "foo", "bar", Symbol(symbol) ]emitter.getMaxListeners()返回 EventEmitter 當(dāng)前的監(jiān)聽器最大限制數(shù)的值 emitter.listenerCount(eventName)返回正在監(jiān)聽的名為 eventName 的事件的監(jiān)聽器的數(shù)量。 emitter.listeners(eventName)返回名為 eventName 的事件的監(jiān)聽器數(shù)組的副本。
let fn1 = ()=>{}, fn2 = ()=>{}; myEmitter.on("foo", fn1); myEmitter.on("foo", fn2); console.log(myEmitter.listeners("foo")); //[ [Function: fn1], [Function: fn2] ]emitter.off(eventName, listener), emitter.removeListener() 的別名。 emitter.prependListener(eventName, listener)添加 listener 函數(shù)到名為 eventName 的事件的監(jiān)聽器數(shù)組的開頭。 不會(huì)檢查 listener 是否已被添加。 多次調(diào)用并傳入相同的 eventName 和 listener 會(huì)導(dǎo)致 listener 被添加多次。 emitter.prependOnceListener(eventName, listener)添加單次監(jiān)聽器 listener 到名為 eventName 的事件的監(jiān)聽器數(shù)組的開頭。 當(dāng) eventName 事件下次觸發(fā)時(shí),監(jiān)聽器會(huì)先被移除,然后再調(diào)用。 emitter.removeAllListeners([eventName])移除全部監(jiān)聽器或指定的 eventName 事件的監(jiān)聽器。 emitter.removeListener(eventName, listener)從名為 eventName 的事件的監(jiān)聽器數(shù)組中移除指定的 listener。
let fn1 = ()=>{console.log(1)}, fn2 = ()=>{console.log(2)};//2 myEmitter.on("foo", fn1); myEmitter.on("foo", fn2); console.log(myEmitter.listeners("foo")); //[ [Function: fn1], [Function: fn2] ] myEmitter.off("foo", fn1); myEmitter.emit("foo");emitter.setMaxListeners(n)默認(rèn)情況下,如果為特定事件添加了超過 10 個(gè)監(jiān)聽器,則 EventEmitter 會(huì)打印一個(gè)警告。 這有助于發(fā)現(xiàn)內(nèi)存泄露。 但是,并不是所有的事件都要限制 10 個(gè)監(jiān)聽器。 emitter.setMaxListeners() 方法可以為指定的 EventEmitter 實(shí)例修改限制。 值設(shè)為 Infinity(或 0)表示不限制監(jiān)聽器的數(shù)量。 emitter.rawListeners(eventName)返回 eventName 事件的監(jiān)聽器數(shù)組的拷貝,包括封裝的監(jiān)聽器(例如由 .once() 創(chuàng)建的)。
const emitter = new EventEmitter(); emitter.once("log", () => console.log("只記錄一次")); // 返回一個(gè)數(shù)組,包含了一個(gè)封裝了 `listener` 方法的監(jiān)聽器。 const listeners = emitter.rawListeners("log"); const logFnWrapper = listeners[0]; // 打印 “只記錄一次”,但不會(huì)解綁 `once` 事件。 logFnWrapper.listener(); // 打印 “只記錄一次”,且移除監(jiān)聽器。 logFnWrapper(); emitter.on("log", () => console.log("持續(xù)地記錄")); // 返回一個(gè)數(shù)組,只包含 `.on()` 綁定的監(jiān)聽器。 const newListeners = emitter.rawListeners("log"); // 打印兩次 “持續(xù)地記錄”。 newListeners[0](); emitter.emit("log");
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99852.html
摘要:打印的參數(shù)分別為移除的監(jiān)聽事件和該事件的句柄函數(shù)默認(rèn)情況下,每個(gè)事件可以注冊(cè)最多個(gè)監(jiān)聽器。返回已注冊(cè)監(jiān)聽器的事件名數(shù)組。值設(shè)為或表示不限制監(jiān)聽器的數(shù)量。持續(xù)地記錄返回一個(gè)數(shù)組,只包含綁定的監(jiān)聽器。 [github地址:https://github.com/ABCDdouyae...] events 事件觸發(fā)器 大多數(shù) Node.js 核心 API 構(gòu)建于慣用的異步事件驅(qū)動(dòng)架構(gòu),其中某些...
摘要:問題如何列舉一個(gè)目錄下的所有文件解決方案使用如果只需要文本文件的話,就結(jié)合進(jìn)行過濾如果對(duì)文件有匹配需求的話,比如只需要某個(gè)目錄的文件,那么可以使用模塊,例如討論會(huì)返回一個(gè)列表,包含目錄下的所有文件,但不會(huì)包含和,即使他們是存在的。 問題 如何列舉一個(gè)目錄下的所有文件 解決方案 使用os.listdir() >>> import os >>> os.listdir(.) [.androi...
摘要:地址源碼依賴一個(gè)對(duì)象的屬性繼承另一個(gè)對(duì)象的屬性及其屬性描述符用法繼承者,被繼承者是否繼承者有該屬性的時(shí)候繼承默認(rèn)不繼承返回繼承后的新的對(duì)象當(dāng)?shù)谌齻€(gè)參數(shù)為時(shí)候,原對(duì)象又該屬性則沒有繼承被繼承者的屬性和屬性描述符 [github地址:https://github.com/ABCDdouyae...] merge-descriptors (express源碼依賴) 一個(gè)對(duì)象的屬性繼承另一個(gè)對(duì)...
摘要:地址源碼依賴一個(gè)對(duì)象的屬性繼承另一個(gè)對(duì)象的屬性及其屬性描述符用法繼承者,被繼承者是否繼承者有該屬性的時(shí)候繼承默認(rèn)不繼承返回繼承后的新的對(duì)象當(dāng)?shù)谌齻€(gè)參數(shù)為時(shí)候,原對(duì)象又該屬性則沒有繼承被繼承者的屬性和屬性描述符 [github地址:https://github.com/ABCDdouyae...] merge-descriptors (express源碼依賴) 一個(gè)對(duì)象的屬性繼承另一個(gè)對(duì)...
閱讀 992·2021-11-24 09:39
閱讀 3431·2021-10-27 14:20
閱讀 2347·2019-08-30 14:08
閱讀 3389·2019-08-29 16:34
閱讀 2205·2019-08-26 12:14
閱讀 2132·2019-08-26 11:54
閱讀 2804·2019-08-26 11:44
閱讀 2506·2019-08-26 11:38