国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【Node事件模塊Events】

junnplus / 783人閱讀

環(huán)境:Node v8.2.1; Npm v5.3.0;OS Windows10

1、 Node事件介紹

Node大多數(shù)核心 API 都采用慣用的異步事件驅(qū)動(dòng)架構(gòu),其中某些類型的對(duì)象(觸發(fā)器)會(huì)周期性地觸發(fā)命名事件來調(diào)用函數(shù)對(duì)象(監(jiān)聽器)。

所有能觸發(fā)事件的對(duì)象都是 EventEmitter 類的實(shí)例。 這些對(duì)象開放了一個(gè) eventEmitter.on() 函數(shù),允許將一個(gè)或多個(gè)函數(shù)綁定到會(huì)被對(duì)象觸發(fā)的命名事件上。 事件名稱通常是駝峰式的字符串,但也可以使用任何有效的 JavaScript 屬性名。

當(dāng) EventEmitter 對(duì)象觸發(fā)一個(gè)事件時(shí),所有綁定在該事件上的函數(shù)都被同步地調(diào)用。 監(jiān)聽器的返回值會(huì)被丟棄。

2、events 模塊API介紹

3、 一些例子

下面是一些簡(jiǎn)單的例子,對(duì)應(yīng)上面的API的一個(gè)代碼實(shí)現(xiàn)

3.1 綁定和觸發(fā)事件
const EventEmitter = require("events");

//自定義一個(gè)對(duì)象繼承于EventEmitter
class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

myEmitter.on("event", () => {
  console.log("觸發(fā)了一個(gè)事件!");
});

myEmitter.emit("event");
3.2 為事件傳遞參數(shù)
const EventEmitter = require("events");

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on("event", (a,b) => {
 console.log(a,b);
 //1,2
}); 
myEmitter.emit("event","a","b");
3.3 this 的問題

當(dāng)一個(gè)普通的監(jiān)聽器函數(shù)被 EventEmitter 調(diào)用時(shí),標(biāo)準(zhǔn)的 this 關(guān)鍵詞會(huì)被設(shè)置指向監(jiān)聽器所附加的 EventEmitter。

const EventEmitter = require("events");

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on("event", function() {
    console.log(this);
    /*
        a b MyEmitter {
            domain: null,
            _events: { event: [Function] },
            _eventsCount: 1,
            _maxListeners: undefined 
        }
    */
   }); 
myEmitter.emit("event");

也可以使用 ES6 的箭頭函數(shù)作為監(jiān)聽器。但是這樣 this 關(guān)鍵詞就不再指向 EventEmitter 實(shí)例:

const EventEmitter = require("events");

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on("event", () => {
    console.log(this);
    //{}
}); 

myEmitter.emit("event");
3.4 異步執(zhí)行

EventListener 會(huì)按照監(jiān)聽器注冊(cè)的順序同步地調(diào)用所有監(jiān)聽器,監(jiān)聽器函數(shù)可以使用 setImmediate() 或 process.nextTick() 方法切換到異步操作模式:

const EventEmitter = require("events");

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on("event", (a,b) => {
    setImmediate(()=>{
        //異步觸發(fā)
        console.log(a,b);
    })
    console.log("c");
}); 

myEmitter.emit("event","a","b");
//c
//a b
3.5 無限次觸發(fā)和一次觸發(fā)

事件默認(rèn)是可以無限次數(shù)的觸發(fā)的,只要觸發(fā)一次,對(duì)應(yīng)的監(jiān)聽函數(shù)就執(zhí)行一次;有時(shí)候我們希望只執(zhí)行一次監(jiān)聽函數(shù),可以使用【once】對(duì)事件進(jìn)行綁定

多次觸發(fā):

const EventEmitter = require("events")

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

let m = 0;

myEmitter.on("event", () => {
    console.log(++m);
});

myEmitter.emit("event");    //1

myEmitter.emit("event");    //2

myEmitter.emit("event");    //3

一次觸發(fā):

const EventEmitter = require("events")

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

let m = 0;

myEmitter.once("event", () => {
    console.log(++m);
});

myEmitter.emit("event");    //1

myEmitter.emit("event");    //忽略

myEmitter.emit("event");    //忽略
3.6 錯(cuò)誤事件

當(dāng) EventEmitter 實(shí)例中發(fā)生錯(cuò)誤時(shí),會(huì)觸發(fā)一個(gè) "error" 事件,如果 EventEmitter 沒有為 "error" 事件注冊(cè)至少一個(gè)監(jiān)聽器,則當(dāng) "error" 事件觸發(fā)時(shí),會(huì)拋出錯(cuò)誤、打印堆棧跟蹤、且退出 Node.js 進(jìn)程。

const EventEmitter = require("events");

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

myEmitter.emit("error", new Error("whoops!"));
// 拋出錯(cuò)誤,并使 Node.js 崩潰

為了防止 Node.js 進(jìn)程崩潰,可以在 process 對(duì)象的 uncaughtException 事件上注冊(cè)監(jiān)聽器

const EventEmitter = require("events")

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();
//在進(jìn)程上面注冊(cè)錯(cuò)誤監(jiān)聽,使進(jìn)程不崩潰
process.on("uncaughtException",()=>{
    console.error("有錯(cuò)誤");
});

myEmitter.emit("error",new Error("whoops"))

上面這樣的方式并不是最佳實(shí)踐,最好是為【error】注冊(cè)監(jiān)聽函數(shù)

3.7 獲取和修改最大事件監(jiān)聽數(shù)量

Node默認(rèn)一個(gè)事件的監(jiān)聽數(shù)量為10個(gè),超過十個(gè)將會(huì)發(fā)出警告

const EventEmitter = require("events")

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

console.log(EventEmitter.defaultMaxListeners);    //10

for (let i = 0; i < 11; i++) {
    myEmitter.on("event", () => {
        console.log(i);
    });
}
myEmitter.emit("event")
//MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 event listeners added. Use emitter.setMaxListeners() to increase limit

改變指定的 EventEmitter 實(shí)例的監(jiān)聽器限制

const EventEmitter = require("events")

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

myEmitter.setMaxListeners(13);

for (let i = 0; i < 11; i++) {
    myEmitter.on("event", () => {
        console.log(i);
    });
}
myEmitter.emit("event")
3.8 newListener事件

EventEmitter 實(shí)例會(huì)在一個(gè)監(jiān)聽器被添加到其內(nèi)部監(jiān)聽器數(shù)組【之前】觸發(fā)自身的 "newListener" 事件

const EventEmitter = require("events")

class MyEmitter extends EventEmitter { }

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
*/

CSDN 【Node事件模塊Events】同步更新

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/88738.html

相關(guān)文章

  • 深入nodejs-核心模塊Events詳解(事件驅(qū)動(dòng))

    摘要:實(shí)現(xiàn)方式其實(shí)就是對(duì)方法做了一層封裝,將一個(gè)封裝好的代替?zhèn)鬟f給方法內(nèi)部會(huì)執(zhí)行一次監(jiān)聽回調(diào)函數(shù),然后再調(diào)用對(duì)該回調(diào)進(jìn)行刪除。 事件驅(qū)動(dòng) Node.js 是一個(gè)基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境。Node.js 使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式 I/O的模型,使其輕量又高效。Allows you to build scalable network applicati...

    hidogs 評(píng)論0 收藏0
  • Node 之 Event 模塊

    摘要:為什么把叫做集合而不能稱為嚴(yán)格意義上的對(duì)象,來看這個(gè)集合的構(gòu)造函數(shù)可以見得,是與處于同一層級(jí)的而非是繼承自,所以說由實(shí)例出來的對(duì)象更加的純凈,并沒有諸如等方法,更像是一個(gè)集合。 寫在前面 事件的編程方式具有輕量級(jí)、松耦合、只關(guān)注事務(wù)點(diǎn)等優(yōu)勢(shì),在瀏覽器端,有著自己的一套DOM事件機(jī)制,其中含包括這諸如事件冒泡,事件捕獲等;然而Node的事件機(jī)制沒有事件冒泡等,其原理就是設(shè)計(jì)模式中的觀察者...

    mrli2016 評(píng)論0 收藏0
  • Node.js知識(shí)點(diǎn)詳解(二)HTTP模塊事件模塊

    摘要:如果不能快速返回,就應(yīng)當(dāng)將其遷移到另一個(gè)進(jìn)程中模塊讓開發(fā)人員可以為事件設(shè)置偵聽器和處理器。我們需要給每個(gè)想要響應(yīng)的事件創(chuàng)建偵聽器 Node.js的http服務(wù)器 通過使用HTTP模塊的低級(jí)API,Node.js允許我們創(chuàng)建服務(wù)器和客戶端。剛開始學(xué)node的時(shí)候,我們都會(huì)遇到如下代碼: var http = require(http); http.createServer(funct...

    Lionad-Morotar 評(píng)論0 收藏0
  • Node事件機(jī)制小記

    摘要:事件的監(jiān)聽與事件的觸發(fā)事件一事件機(jī)制的實(shí)現(xiàn)中大部分的模塊,都繼承自模塊。從另一個(gè)角度來看,事件偵聽器模式也是一種事件鉤子的機(jī)制,利用事件鉤子導(dǎo)出內(nèi)部數(shù)據(jù)或狀態(tài)給外部調(diào)用者。的核心就是事件發(fā)射與事件監(jiān)聽器功能的封裝。 nodejs事件的監(jiān)聽與事件的觸發(fā) nodejs事件(Events)showImg(https://segmentfault.com/img/bV0Sqi?w=692&h=...

    airborne007 評(píng)論0 收藏0
  • EventEmitter的實(shí)現(xiàn)

    摘要:實(shí)例方法的話,最核心的就是分別是添加事件,刪除事件,發(fā)布事件。為了防止進(jìn)程崩潰,可以在對(duì)象的事件上注冊(cè)監(jiān)聽器,或使用模塊。注意,模塊已被廢棄。作為最佳實(shí)踐,應(yīng)該始終為事件注冊(cè)監(jiān)聽器。 前言 事件在js中非常的常見,不管是瀏覽器還是node,這種事件發(fā)布/訂閱模式的應(yīng)用都是很常見的。至于發(fā)布/訂閱模式和觀察者模式是否是同一種設(shè)計(jì)模式說法都有,這里不做具體的討論。在之前的項(xiàng)目中也曾自己實(shí)現(xiàn)...

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

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

0條評(píng)論

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