成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【每日一包0025】events

shixinzhang / 2443人閱讀

摘要:打印的參數(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

相關(guān)文章

  • 每日一包0025events

    摘要:打印的參數(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),其中某些...

    fxp 評(píng)論0 收藏0
  • Python每日一練0025

    摘要:問題如何列舉一個(gè)目錄下的所有文件解決方案使用如果只需要文本文件的話,就結(jié)合進(jìn)行過濾如果對(duì)文件有匹配需求的話,比如只需要某個(gè)目錄的文件,那么可以使用模塊,例如討論會(huì)返回一個(gè)列表,包含目錄下的所有文件,但不會(huì)包含和,即使他們是存在的。 問題 如何列舉一個(gè)目錄下的所有文件 解決方案 使用os.listdir() >>> import os >>> os.listdir(.) [.androi...

    Rindia 評(píng)論0 收藏0
  • 每日一包0029】merge-descriptors

    摘要:地址源碼依賴一個(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ì)...

    kun_jian 評(píng)論0 收藏0
  • 每日一包0029】merge-descriptors

    摘要:地址源碼依賴一個(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ì)...

    printempw 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<