最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node中的Events模塊介紹及應(yīng)用

 更新時(shí)間:2022年08月05日 17:11:33   作者:夏安  
events模塊是node內(nèi)置的核心模塊 這個(gè)模塊是node中一個(gè)非常重要的核心模塊,node中所有能觸發(fā)事件的對(duì)象都是這個(gè)類的實(shí)例

Node 中的 Events

Node 的 Events 模塊只定義了一個(gè)類,就是 EventEmitter(以下簡(jiǎn)稱 Event ),這個(gè)類在很多 Node 本身以及第三方模塊中大量使用,通常是用作基類被繼承。

在 Node 中,事件的應(yīng)用遍及代碼的每一個(gè)角落。

1. 事件和監(jiān)聽(tīng)器

Node 程序中的對(duì)象會(huì)產(chǎn)生一系列的事件,它們被稱為事件觸發(fā)器(event emitter),例如一個(gè) HTTP Server 會(huì)在每次有新連接時(shí)觸發(fā)一個(gè)事件,一個(gè) Readable Stream 會(huì)在文件打開(kāi)時(shí)觸發(fā)一個(gè)事件等。

所有能觸發(fā)事件的對(duì)象都是 EventEmitter 類的實(shí)例。EventEmitter 定義了 on 方法,該方法的聲明如下:

emitter.on(eventName, listener)
eventName <String> | <Symbol> The name of the event.
listener <Function> The callback function

on 方法接受兩個(gè)參數(shù):需要監(jiān)聽(tīng)的事件的名稱,當(dāng)事件觸發(fā)時(shí)需要調(diào)用的函數(shù)。因?yàn)?EventEmitter 是接口,從 EventEmitter 繼承的類需要使用 new 關(guān)鍵字來(lái)構(gòu)造。

觸發(fā)事件監(jiān)聽(tīng)器很簡(jiǎn)單,只要調(diào)用 EventEmitter實(shí)例的 emit 方法就行了。需要注意的是,這些事件是針對(duì)某個(gè)實(shí)例的,不存在全局的事件。當(dāng)你調(diào)用 on 方法的時(shí)候,需要綁定在特定的基于 EventEmitter 的對(duì)象上。EventEmitter 類不同的實(shí)例之間也不會(huì)共享事件。

下面是一個(gè)事件注冊(cè)和觸發(fā)事件的例子。

const eventEmitter = require('events');
const myEmitter = new eventEmitter();
myEmitter.on('begin', () => {
  console.log('begin');
});
myEmitter.emit('begin');

上面的代碼中,首先初始化了一個(gè) EventEmitter 實(shí)例,然后注冊(cè)了一個(gè)名為 begin 的事件,之后調(diào)用 emit 方法觸發(fā)了這一事件。

用戶可以注冊(cè)多個(gè)同名的事件,在上面的例子中,如果注冊(cè)兩個(gè)名為 begin 的事件,那么它們都會(huì)被觸發(fā)。

如果想獲取當(dāng)前的 emitter 一共注冊(cè)了哪些事件,可以使用 eventNames 方法。

console.log(myEmitter.eventNames());

該方法會(huì)輸出包括全部事件名稱的數(shù)組。就算注冊(cè)了兩個(gè)同名的 event,輸出結(jié)果也只有一個(gè),說(shuō)明該方法的結(jié)果集并不包含重復(fù)結(jié)果。

2. 處理 error 事件

由于 Node 代碼運(yùn)行在單線程環(huán)境中,那么運(yùn)行時(shí)出現(xiàn)的任何錯(cuò)誤都有可能導(dǎo)致整個(gè)進(jìn)程退出。利用事件機(jī)制可以實(shí)現(xiàn)簡(jiǎn)單的錯(cuò)誤處理功能。

當(dāng) Node 程序出現(xiàn)錯(cuò)誤的時(shí)候,通常會(huì)觸發(fā)一個(gè)錯(cuò)誤事件,如果代碼中沒(méi)有注冊(cè)相應(yīng)的處理方法,會(huì)導(dǎo)致 Node 進(jìn)程崩潰退出。例如:

myEmitter.emit("error", new Error("crash!"));

上面的代碼主動(dòng)拋出了一個(gè) emor,相當(dāng)于:

throw new Error ("crash");

如果我們不想因?yàn)閽伋鲆粋€(gè) error 而使進(jìn)程退出,那么可以讓 uncaughtException 事件作為最后一道防線來(lái)捕獲異常。

const eventEmitter = require('events');
const myEmitter = new eventEmitter();
process.on('uncaughtException', () => {
  console.log('got error');
});
throw new Error('Error occurred');

這種錯(cuò)誤處理的方式雖然可以捕獲異常,避免了進(jìn)程的退出,但不值得提倡。

關(guān)于其常見(jiàn)的方法如下:

  • emitter.addListener/on(eventName, listener) :添加類型為 eventName 的監(jiān)聽(tīng)事件到事件數(shù)組尾部
  • emitter.prependListener(eventName, listener):添加類型為 eventName 的監(jiān)聽(tīng)事件到事件數(shù)組頭部
  • emitter.emit(eventName[, ...args]):觸發(fā)類型為 eventName 的監(jiān)聽(tīng)事件
  • emitter.removeListener/off(eventName, listener):移除類型為 eventName 的監(jiān)聽(tīng)事件
  • emitter.once(eventName, listener):添加類型為 eventName 的監(jiān)聽(tīng)事件,以后只能執(zhí)行一次并刪除
  • emitter.removeAllListeners([eventName]): 移除全部類型為 eventName 的監(jiān)聽(tīng)事件

3. 繼承 Events 模塊

在實(shí)際的開(kāi)發(fā)中,通常不會(huì)直接使用 Event 模塊來(lái)進(jìn)行事件處理,而是選擇將其作為基類進(jìn)行繼承的方式來(lái)使用 Event,在 Node 的內(nèi)部實(shí)現(xiàn)中,凡是提供了事件機(jī)制的模塊,都會(huì)在內(nèi)部繼承 Event 模塊。

4. 手寫 EventEmitter

下面我們來(lái)看看如何手寫一個(gè) EventEmitter

class EventEmitter {
  constructor() {
    this.events = {};
  }
  on(type, handler) {
    if (!this.events[type]) {
      this.events[type] = [];
    }
    this.events[type].push(handler);
  }
  addListener(type, handler) {
    this.on(type, handler)
  }
  prependListener(type, handler) {
    if (!this.events[type]) {
      this.events[type] = [];
    }
    this.events[type].unshift(handler);
  }
  removeListener(type, handler) {
    if (!this.events[type]) {
      return;
    }
    this.events[type] = this.events[type].filter(item => item !== handler);
  }
  off(type, handler) {
    this.removeListener(type, handler)
  }
  emit(type, ...args) {
    this.events[type].forEach((item) => {
      Reflect.apply(item, this, args);
    });
  }
  once(type, handler) {
    this.on(type, this._onceWrap(type, handler, this));
  }
  _onceWrap(type, handler, target) {
    const state = {
      fired: false,
      handler,
      type,
      target
    };
    const wrapFn = this._onceWrapper.bind(state);
    state.wrapFn = wrapFn;
    return wrapFn;
  }
  _onceWrapper(...args) {
    if (!this.fired) {
      this.fired = true;
      Reflect.apply(this.handler, this.target, args);
      this.target.off(this.type, this.wrapFn);
    }
  }
}

到此這篇關(guān)于Node中的Events事件介紹及應(yīng)用的文章就介紹到這了,更多相關(guān)Node Events內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何在node.js中使用?JsonWebToken模塊進(jìn)行token加密

    如何在node.js中使用?JsonWebToken模塊進(jìn)行token加密

    目前在web框架中最流行的身份驗(yàn)證是使用jsonwebtoken,簡(jiǎn)稱jwt.可以設(shè)置加密方式,過(guò)期時(shí)間,存放個(gè)人信息,逆解析,下面這篇文章主要給大家介紹了關(guān)于如何在node.js中使用?JsonWebToken模塊進(jìn)行token加密的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • nodejs下載指定版本完整圖文步驟

    nodejs下載指定版本完整圖文步驟

    node.js官方版是一款專業(yè)性非常強(qiáng)的瀏覽輔助工具軟件,這款軟件操作十分的簡(jiǎn)單、功能也是非常的強(qiáng)勁,下面這篇文章主要給大家介紹了關(guān)于nodejs下載指定版本的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • node?+?multer?實(shí)現(xiàn)文件上傳過(guò)程

    node?+?multer?實(shí)現(xiàn)文件上傳過(guò)程

    這篇文章主要介紹了node?+?multer?實(shí)現(xiàn)文件上傳過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 基于Node的Axure文件在線預(yù)覽的實(shí)現(xiàn)代碼

    基于Node的Axure文件在線預(yù)覽的實(shí)現(xiàn)代碼

    這篇文章主要介紹了基于Node的Axure文件在線預(yù)覽的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Koa2微信公眾號(hào)開(kāi)發(fā)之消息管理

    Koa2微信公眾號(hào)開(kāi)發(fā)之消息管理

    這篇文章主要介紹了Koa2微信公眾號(hào)開(kāi)發(fā)之消息管理,這一節(jié)我們就來(lái)看看公眾號(hào)的消息管理。并實(shí)現(xiàn)一個(gè)自動(dòng)回復(fù)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 淺談node如何優(yōu)雅地獲取mac系統(tǒng)版本

    淺談node如何優(yōu)雅地獲取mac系統(tǒng)版本

    這篇文章主要和大家聊聊node如何優(yōu)雅地獲取mac系統(tǒng)版本,文中有詳細(xì)的代碼示例和流程步驟,對(duì)我們學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-06-06
  • 在Node.js中判定文件是否可執(zhí)行的方法詳解

    在Node.js中判定文件是否可執(zhí)行的方法詳解

    在進(jìn)行前端開(kāi)發(fā)時(shí),經(jīng)常需要處理各種文件權(quán)限的問(wèn)題,特別是在Node.js環(huán)境中,你可能想要判斷某個(gè)文件是否具有可執(zhí)行權(quán)限,本文將詳細(xì)介紹如何使用isexe模塊來(lái)進(jìn)行這一操作,需要的朋友可以參考下
    2024-05-05
  • node.js中的fs.write方法使用說(shuō)明

    node.js中的fs.write方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.write方法使用說(shuō)明,本文介紹了fs.write的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 什么是MEAN?JavaScript編程中的MEAN是什么意思?

    什么是MEAN?JavaScript編程中的MEAN是什么意思?

    這篇文章主要介紹了什么是MEAN?JavaScript編程中的MEAN是什么意思?,跟lampp一樣,MEAN是指現(xiàn)代web應(yīng)用全棧開(kāi)發(fā)工具一個(gè)組合,需要的朋友可以參考下
    2014-12-12
  • Express之托管靜態(tài)文件的方法

    Express之托管靜態(tài)文件的方法

    本篇文章主要介紹了Express之托管靜態(tài)文件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06

最新評(píng)論

玉环县| 芜湖县| 双柏县| 衡山县| 古蔺县| 长子县| 盱眙县| 富蕴县| 宣武区| 定襄县| 永年县| 修武县| 惠安县| 庐江县| 鄱阳县| 邵武市| 盘锦市| 武功县| 志丹县| 江永县| 马鞍山市| 龙门县| 永州市| 平远县| 永清县| 镇原县| 汉寿县| 鄂伦春自治旗| 伊通| 榆林市| 常山县| 龙川县| 竹北市| 丹江口市| 葫芦岛市| 南丹县| 织金县| 三门县| 宜城市| 和田县| 呼玛县|