目錄
EventEmitter
方法
設定
事件
首頁 web前端 js教程 深入淺析nodejs中的events模組

深入淺析nodejs中的events模組

Mar 01, 2021 am 10:41 AM
nodejs

本篇文章和大家詳細介紹一下node中的events模組。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

深入淺析nodejs中的events模組

相關推薦:《nodejs 教學

events模組是node的核心模組,幾乎所有常用的node模組都會繼承了events模組,比如http、fs等。本文將詳細介紹nodeJS中的事件機制

EventEmitter

  多數Node.js 核心API 都是採用慣用的非同步事件驅動架構,其中某些類型的物件(稱為觸發器)會週期性地觸發命名事件來呼叫函數物件(監聽器)。例如,一個net.Server物件會在每次有新連線時觸發一個事件;一個 fs.ReadStream 會在檔案開啟時觸發一個事件;一個 stream會在資料可讀時觸發事件。

【EventEmitter】

  EventEmitter 類別由events 模組定義和開放的,所有能觸發事件的物件都是EventEmitter 類別的實例

var EventEmitter = require('events');
/*
{ [Function: EventEmitter]
  EventEmitter: [Circular],
  usingDomains: false,
  defaultMaxListeners: [Getter/Setter],
  init: [Function],
  listenerCount: [Function] }
 */
console.log(EventEmitter);
登入後複製

  events模組的EventEmitter屬性指向這個模組本身

var events = require('events');
console.log(events.EventEmitter === events);//true
登入後複製

  EventEmitter是一個建構函數,可以用來產生事件產生器的實例emitter

var EventEmitter = require('events');
var emitter = new EventEmitter();
/*
EventEmitter {
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined }
 */
console.log(emitter);
登入後複製

方法

【emitter.emit(eventName[, .. .args])】

eventName <any>
...args <any>
登入後複製

  此方法依監聽器的註冊順序,同步地呼叫每個註冊到名為eventName事件的監聽器,並傳入提供的參數。如果事件有監聽器,則傳回true,否則傳回false

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test1',function(){});
console.log(emitter.emit('test1'));//true
console.log(emitter.emit('test2'));//false
登入後複製

【emitter.on(eventName, listener)】

  該方法用於新增listener函數到名為eventName的事件的監聽器陣列的結尾

eventName <any> 事件名
listener <Function> 回调函数
登入後複製
登入後複製

  [注意]不會檢查listener是否已被新增。多次呼叫並傳入相同的eventName和listener會導致listener被加入與呼叫多次

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
});
emitter.on('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2
登入後複製

  該方法傳回一個EventEmitter 引用,可以鍊式呼叫

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).on('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2
登入後複製

【emitter.addListener( eventName, listener)】

  emitter.on(eventName, listener) 的別名

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.addListener('test',function(){
    console.log(1);
});
emitter.emit('test');//1
登入後複製

【emitter.prependListener()】

  與on()方法不同,prependListener( )方法可用來將事件監聽器加入監聽器陣列的開頭

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).prependListener('test',function(){
    console.log(2);
});
emitter.emit('test');//2 1
登入後複製

【emitter.once(eventName, listener)】

  該方法新增一個單次listener 函數到名為eventName的事件。下次觸發eventName 事件時,監聽器會被移除,然後呼叫

eventName <any> 事件名
listener <Function> 回调函数
登入後複製
登入後複製
var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).once('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2
emitter.emit('test');//1
登入後複製

【emitter.prependOnceListener() 】

  此方法用於將事件監聽器新增至監聽器陣列開頭。下次觸發eventName事件時,監聽器會被移除,然後呼叫

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).prependOnceListener('test',function(){
    console.log(2);
});
emitter.emit('test');//2 1
emitter.emit('test');//1
登入後複製

【emitter.removeAllListeners([eventName])】

eventName <any>
登入後複製
登入後複製

  移除全部或指定eventName 的監聽器,傳回一個EventEmitter 引用,可以鍊式呼叫

  [注意]在程式碼中移除其他地方新增的監聽器是一個不好的做法,尤其是當EventEmitter 實例是其他元件或模組(如socket 或文件流)所建立的

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).removeAllListeners('test');
emitter.emit('test');//''
登入後複製

【emitter.removeListener(eventName, listener)】

eventName <any>
listener 
登入後複製

  從名為eventName 的事件的監聽器陣列中移除指定的listener

var EventEmitter = require('events');
var emitter = new EventEmitter();
function show(){
    console.log(1);
}
emitter.on('test',show).removeListener('test',show);
emitter.emit('test');//''
登入後複製

  [注意]removeListener最多只會從監聽器陣列移除一個監聽器實例。如果任何單一的監聽器被多次加入到指定eventName的監聽器陣列中,則必須多次呼叫removeListener才能移除每個實例

var EventEmitter = require('events');
var emitter = new EventEmitter();
function show(){
    console.log(1);
}
emitter.on('test',show).on('test',show).removeListener('test',show);
emitter.emit('test');//'1'
登入後複製

  [注意]一旦一個事件被觸發,所有綁定到它的監聽器都會依序依序觸發。這意味著,在事件觸發後、最後一個監聽器完成執行之前,任何 removeListener() 或 removeAllListeners() 呼叫都不會從 emit() 中移除它們。隨後的事件會像預期的那樣發生

  因為監聽器是使用內部數組進行管理的,所以調用它會改變在監聽器被移除後註冊的任何監聽器的位置索引。雖然這不會影響監聽器的呼叫順序,但意味著由emitter.listeners() 方法傳回的監聽器陣列副本需要被重新建立

var EventEmitter = require('events');
var emitter = new EventEmitter();
function show1(){
    console.log(1);
    emitter.removeListener('test',show2);
}
function show2(){
    console.log(2);
}
emitter.on('test',show1).on('test',show2);
emitter.emit('test');//1 2
emitter.emit('test');//1
登入後複製

設定

【emitter.eventNames( )】

  傳回一個列出觸發器已註冊監聽器的事件的陣列。陣列中的值為字串或符號

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.addListener('test1',function(){console.log(1);});
emitter.addListener('test2',function(){console.log(2);});
console.log(emitter.eventNames());//[ 'test1', 'test2' ]
登入後複製

【emitter.listenerCount(eventName)】

eventName <any> 正在被监听的事件名
登入後複製

  傳回正在監聽名為eventName 的事件的監聽器的數量

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.addListener('test',function(){console.log(1);});
emitter.addListener('test',function(){console.log(1);});
console.log(emitter.listenerCount('test'));//2
登入後複製

【emitter.listeners(eventName)】

eventName <any>
登入後複製
登入後複製

  傳回名為eventName 的事件的監聽器陣列的副本

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.addListener('test',function(){console.log(1);});
emitter.addListener('test',function(){console.log(2);});
console.log(emitter.listeners('test'));//[ [Function], [Function] ]emitter.listeners('test')[0]();//1
登入後複製

【emitter.getMaxListeners()】

  EventEmitteritter.getMaxListeners()】

  EventEmitteritter目前的最大監聽器限制值

var EventEmitter = require('events');
var emitter = new EventEmitter();
console.log(emitter.getMaxListeners());//10
登入後複製
###【emitter.setMaxListeners(n)】###

  默认情况下,如果为特定事件添加了超过 10 个监听器,则 EventEmitter 会打印一个警告。 此限制有助于寻找内存泄露。 但是,并不是所有的事件都要被限为 10 个。 emitter.setMaxListeners() 方法允许修改指定的 EventEmitter 实例的限制。 值设为 Infinity(或 0)表明不限制监听器的数量。返回一个 EventEmitter 引用,可以链式调用

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});
/*
Warning: Possible EventEmitter memory leak detected. 11 a listeners added. Use emitter.setMaxListeners() to increase limit
 */
登入後複製
var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.setMaxListeners(11);
emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});
登入後複製

【EventEmitter.defaultMaxListeners】
  每个事件默认可以注册最多10个监听器。单个EventEmitter实例的限制可以使用emitter.setMaxListeners(n)方法改变。所有EventEmitter实例的默认值可以使用EventEmitter.defaultMaxListeners属性改变

  [注意]设置 EventEmitter.defaultMaxListeners 要谨慎,因为会影响所有EventEmitter 实例,包括之前创建的。因而,调用 emitter.setMaxListeners(n) 优先于 EventEmitter.defaultMaxListeners

var EventEmitter = require('events');var emitter = new EventEmitter();
EventEmitter.defaultMaxListeners = 11;
emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});
登入後複製

事件

【'newListener' 事件】

eventName <any> 要监听的事件的名称
listener  事件的句柄函数
登入後複製

  EventEmitter 实例会在一个监听器被添加到其内部监听器数组之前触发自身的 'newListener' 事件

  注册了 'newListener' 事件的监听器会传入事件名与被添加的监听器的引用。事实上,在添加监听器之前触发事件有一个微妙但重要的副作用: 'newListener' 回调中任何额外的被注册到相同名称的监听器会在监听器被添加之前被插入 

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('newListener',function(){
    console.log(2);
})
emitter.on('test',function(){
    console.log(1);
})

emitter.emit('test');//2 1
登入後複製
var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
})
emitter.on('newListener',function(){
    console.log(2);
})
emitter.emit('test');//1
登入後複製

【'removeListener' 事件】

eventName <any> 事件名
listener  事件句柄函数
登入後複製

  'removeListener' 事件在 listener 被移除后触发

var EventEmitter = require('events');
var emitter = new EventEmitter();
function show(){
    console.log(1);
}
emitter.on('removeListener',function(){
    console.log(2);//2})
emitter.on('test',show).removeListener('test',show);
登入後複製
var EventEmitter = require('events');
var emitter = new EventEmitter();
function show(){
    console.log(1);
}
emitter.on('test',show).removeListener('test',show);
emitter.on('removeListener',function(){
    console.log(2);//''})
登入後複製
var EventEmitter = require('events');
var emitter = new EventEmitter();
function show(){
    console.log(1);
}
emitter.removeListener('test',show);
emitter.on('removeListener',function(){
    console.log(2);//''})
登入後複製

更多编程相关知识,请访问:编程视频!!

以上是深入淺析nodejs中的events模組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

nodejs和vuejs區別 nodejs和vuejs區別 Apr 21, 2024 am 04:17 AM

Node.js 是一種伺服器端 JavaScript 執行時,而 Vue.js 是一個客戶端 JavaScript 框架,用於建立互動式使用者介面。 Node.js 用於伺服器端開發,如後端服務 API 開發和資料處理,而 Vue.js 用於用戶端開發,如單一頁面應用程式和響應式使用者介面。

nodejs是後端框架嗎 nodejs是後端框架嗎 Apr 21, 2024 am 05:09 AM

Node.js 可作為後端框架使用,因為它提供高效能、可擴展性、跨平台支援、豐富的生態系統和易於開發等功能。

nodejs怎麼連接mysql資料庫 nodejs怎麼連接mysql資料庫 Apr 21, 2024 am 06:13 AM

要連接 MySQL 資料庫,需要遵循以下步驟:安裝 mysql2 驅動程式。使用 mysql2.createConnection() 建立連接對象,其中包含主機位址、連接埠、使用者名稱、密碼和資料庫名稱。使用 connection.query() 執行查詢。最後使用 connection.end() 結束連線。

nodejs中的全域變數有哪些 nodejs中的全域變數有哪些 Apr 21, 2024 am 04:54 AM

Node.js 中存在以下全域變數:全域物件:global核心模組:process、console、require執行階段環境變數:__dirname、__filename、__line、__column常數:undefined、null、NaN、Infinity、-Infinity

nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 Apr 21, 2024 am 05:18 AM

Node.js 安裝目錄中有兩個與 npm 相關的文件:npm 和 npm.cmd,區別如下:擴展名不同:npm 是可執行文件,npm.cmd 是命令視窗快捷方式。 Windows 使用者:npm.cmd 可以在命令提示字元中使用,npm 只能從命令列執行。相容性:npm.cmd 特定於 Windows 系統,npm 跨平台可用。使用建議:Windows 使用者使用 npm.cmd,其他作業系統使用 npm。

nodejs和java的差別大嗎 nodejs和java的差別大嗎 Apr 21, 2024 am 06:12 AM

Node.js 和 Java 的主要差異在於設計和特性:事件驅動與執行緒驅動:Node.js 基於事件驅動,Java 基於執行緒驅動。單執行緒與多執行緒:Node.js 使用單執行緒事件循環,Java 使用多執行緒架構。執行時間環境:Node.js 在 V8 JavaScript 引擎上運行,而 Java 在 JVM 上運行。語法:Node.js 使用 JavaScript 語法,而 Java 使用 Java 語法。用途:Node.js 適用於 I/O 密集型任務,而 Java 適用於大型企業應用程式。

nodejs是後端開發語言嗎 nodejs是後端開發語言嗎 Apr 21, 2024 am 05:09 AM

是的,Node.js 是一種後端開發語言。它用於後端開發,包括處理伺服器端業務邏輯、管理資料庫連接和提供 API。

nodejs和java選哪個 nodejs和java選哪個 Apr 21, 2024 am 04:40 AM

Node.js 和 Java 在 Web 開發中各有優劣,因此選擇取決於專案需求。 Node.js 擅長即時應用程式、快速開發和微服務架構,而 Java 則在企業級支援、效能和安全性方面佔優。

See all articles