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