欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

Node 中的 Events

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

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

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

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

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

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

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

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

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

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

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

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

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

console.log(myEmitter.eventNames());

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

2. 處理 error 事件

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

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

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

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

throw new Error ("crash");

如果我們不想因為拋出一個 error 而使進(jìn)程退出,那么可以讓 uncaughtException 事件作為最后一道防線來捕獲異常。

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

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

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

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

3. 繼承 Events 模塊

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

4. 手寫 EventEmitter

下面我們來看看如何手寫一個 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Node.js如何自動審核團(tuán)隊的代碼

    Node.js如何自動審核團(tuán)隊的代碼

    在項目開發(fā)中,統(tǒng)一團(tuán)隊的代碼風(fēng)格很重要,本文介紹如何用Node.js來自動審核,來提高您的開發(fā)速度。
    2016-07-07
  • gyp?ERR!報錯問題解決辦法

    gyp?ERR!報錯問題解決辦法

    這篇文章主要給大家介紹了關(guān)于gyp?ERR!報錯問題的解決辦法,文中將解決的辦法介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • 如何在Node和瀏覽器控制臺中打印彩色文字

    如何在Node和瀏覽器控制臺中打印彩色文字

    這篇文章主要介紹了如何在Node和瀏覽器控制臺中打印彩色文字,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 詳解NodeJS Https HSM雙向認(rèn)證實現(xiàn)

    詳解NodeJS Https HSM雙向認(rèn)證實現(xiàn)

    這篇文章主要介紹了詳解NodeJS Https HSM雙向認(rèn)證實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • 使用命令行升級Node.js的版本的操作指南

    使用命令行升級Node.js的版本的操作指南

    這篇文章主要給大家介紹了關(guān)于如何使用命令行升級Node.js的版本的操作指南,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧
    2023-11-11
  • 給nodejs升級的兩種方法

    給nodejs升級的兩種方法

    nodejs是一種流行的服務(wù)器端JavaScript運行環(huán)境,它經(jīng)常需要更新以獲取最新的功能和性能優(yōu)化,本文將給大家介紹了給nodejs升級的兩種方法,文中通過代碼示例講解非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • node版本過高該如何將node版本降低

    node版本過高該如何將node版本降低

    我們常使用nvm來管理node.js的版本,這樣就可以根據(jù)自己的需要來回切換node.js版本,下面這篇文章主要給大家介紹了關(guān)于node版本過高該如何將node版本降低的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • node.js微信小程序配置消息推送的實現(xiàn)

    node.js微信小程序配置消息推送的實現(xiàn)

    這篇文章主要介紹了node.js微信小程序配置消息推送的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • node+koa+canvas繪制出貨單、收據(jù)票據(jù)的方法

    node+koa+canvas繪制出貨單、收據(jù)票據(jù)的方法

    在生成票據(jù)需求中,我們會想到前端生成或者后端生成返回圖片地址訪問兩個方法,前端生成則不需要調(diào)用接口,而后端是在完成整個流程時就進(jìn)行生成然后把上傳的地址保存數(shù)據(jù)庫,這篇文章主要介紹了node+koa+canvas繪制出貨單,收據(jù),票據(jù),需要的朋友可以參考下
    2022-09-09
  • 初識NodeJS服務(wù)端開發(fā)入門(Express+MySQL)

    初識NodeJS服務(wù)端開發(fā)入門(Express+MySQL)

    本篇文章主要介紹了初識NodeJS服務(wù)端開發(fā)入門(Express+MySQL),可以對數(shù)據(jù)庫中的一張表進(jìn)行簡單的CRUD操作,有興趣的可以了解一下。
    2017-04-04

最新評論