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