目錄
#實例" >#實例
##EventEmitter 類別
首頁 web前端 js教程 聊聊Node.js中的事件驅動程式和EventEmitter類

聊聊Node.js中的事件驅動程式和EventEmitter類

Nov 18, 2021 pm 06:57 PM
node.js 事件

這篇文章帶大家了解一下Node中的事件,聊聊一下事件驅動程式和EventEmitter 類,希望對大家有幫助!

聊聊Node.js中的事件驅動程式和EventEmitter類

Nodejs 是單進程單執行緒應用程序,但是因為V8 引擎提供的非同步執行回調接口,透過這些接口可以處理大量的並發,所以性能非常高。

Node.js 幾乎每一個 API 都是支援回呼函數的。

Node.js 基本上所有的事件機制都是用設計模式中觀察者模式實作。

Node.js 單執行緒類似進入一個while(true)的事件循環,直到沒有事件觀察者退出,每個非同步事件都會產生一個事件觀察者,如果有事件發生就呼叫該回呼函數。


事件驅動程式

Node.js 使用事件驅動模型,當web server接收到請求,就把它關閉然後進行處理,然後去服務下一個web請求。

當這個請求完成,它被放回處理佇列,當到達佇列開頭,這個結果被回傳給使用者。

這個模型非常有效率可擴展性非常強,因為 webserver 一直接受請求而不等待任何讀寫操作。 (這也稱之為非阻塞式IO或事件驅動IO)

在事件驅動模型中,會產生一個主循環來監聽事件,當偵測到事件時觸發回調函數。

Node.js 有多個內建的事件,我們可以透過引入events 模組,並透過實例化EventEmitter 類別來綁定和監聽事件,如下實例:

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
登入後複製
登入後複製

以下程式綁定事件處理程序:

// 绑定事件及事件的处理程序
eventEmitter.on('eventName', eventHandler);
登入後複製

我們可以透過程式觸發事件:

// 触发事件
eventEmitter.emit('eventName');
登入後複製

建立index.js 文件,程式碼如下所示:

//引入 fs 模块
var fs = require("fs");

// 引入 events 模块
var events = require('events');

// 创建对象
var ee = new events.EventEmitter();

// 绑定事件及事件的处理程序
ee.on('res', function (data) {
    console.log('res-1');
    console.log(data);
});
ee.on('res', function () {
    console.log('res-2');
});

fs.readFile('hello.txt',{flag:'r',encoding:'utf-8'},function(err,data){
    if(err){
        console.log("读取出错:"+err);
    }else{
        console.log("读取成功:"+data);
        // 触发res事件
        ee.emit('res',data);
    }
})
登入後複製

接下來讓我們執行以上程式碼:

聊聊Node.js中的事件驅動程式和EventEmitter類

##EventEmitter 類別

#events 模組只提供了一個物件:

events.EventEmitter

EventEmitter

的核心就是事件觸發與事件監聽器功能的封裝。

你可以透過require("events");來存取該模組。

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
登入後複製
登入後複製

EventEmitter 物件如果在實例化時發生錯誤,會觸發 error 事件。當新增新的監聽器時,newListener 事件會觸發,當監聽器被移除時,removeListener 事件會被觸發。 下面我們用一個簡單的範例來說明EventEmitter 的用法:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>//event.js 文件 var EventEmitter = require(&amp;#39;events&amp;#39;).EventEmitter; var event = new EventEmitter(); event.on(&amp;#39;some_event&amp;#39;, function() { console.log(&amp;#39;some_event 事件触发&amp;#39;); }); setTimeout(function() { event.emit(&amp;#39;some_event&amp;#39;); }, 1000);</pre><div class="contentsignin">登入後複製</div></div>執行結果如下:運行這段程式碼,1 秒後控制台輸出了

'some_event 事件觸發'

。其原則是 event 物件註冊了事件 some_event 的監聽器,然後我們透過 setTimeout 在 1000 毫秒以後向 event 物件發送事件 some_event,此時會呼叫some_event 的監聽器。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>$ node event.js some_event 事件触发</pre><div class="contentsignin">登入後複製</div></div>

EventEmitter

的每個事件由一個事件名和若干個參數組成,事件名是一個字串,通常表達一定的語意。對於每個事件,EventEmitter 支援 若干個事件監聽器。 當事件觸發時,註冊到這個事件的事件監聽器被依次調用,事件參數作為回調函數參數傳遞。 讓我們以下面的範例解釋這個過程:

//event.js 文件
var events = require(&#39;events&#39;); 
var emitter = new events.EventEmitter(); 
emitter.on(&#39;someEvent&#39;, function(arg1, arg2) { 
    console.log(&#39;listener1&#39;, arg1, arg2); 
}); 
emitter.on(&#39;someEvent&#39;, function(arg1, arg2) { 
    console.log(&#39;listener2&#39;, arg1, arg2); 
}); 
emitter.emit(&#39;someEvent&#39;, &#39;arg1 参数&#39;, &#39;arg2 参数&#39;);
登入後複製
執行以上程式碼,運行的結果如下:
$ node event.js 
listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数
登入後複製
以上例子中,emitter

為事件someEvent 註冊了兩個事件監聽器,然後觸發了

someEvent ###事件。 ######運行結果中可以看到兩個事件監聽器回呼函數先後呼叫。這就是###EventEmitter###最簡單的用法。 #########EventEmitter### 提供了多個屬性,如 ###on### 和 ###emit###。 ###on### 函數用於綁定事件函數,###emit### 屬性用於觸發一個事件。 ######更多node相關知識,請造訪:###nodejs 教學###! ! ###

以上是聊聊Node.js中的事件驅動程式和EventEmitter類的詳細內容。更多資訊請關注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)

圖文詳解Node V8引擎的記憶體和GC 圖文詳解Node V8引擎的記憶體和GC Mar 29, 2023 pm 06:02 PM

這篇文章帶大家深入了解NodeJS V8引擎的記憶體和垃圾回收器(GC),希望對大家有幫助!

一文聊聊Node中的記憶體控制 一文聊聊Node中的記憶體控制 Apr 26, 2023 pm 05:37 PM

基於無阻塞、事件驅動建立的Node服務,具有記憶體消耗低的優點,非常適合處理海量的網路請求。在海量請求的前提下,就需要考慮「記憶體控制」的相關問題了。 1. V8的垃圾回收機制與記憶體限制 Js由垃圾回收機

事件 ID 4660:已刪除物件 [修復] 事件 ID 4660:已刪除物件 [修復] Jul 03, 2023 am 08:13 AM

我們的一些讀者遇到了事件ID4660。他們通常不確定該怎麼做,所以我們在本指南中解釋。刪除物件時通常會記錄事件ID4660,因此我們還將探索一些實用的方法在您的電腦上修復它。什麼是事件ID4660?事件ID4660與活動目錄中的物件相關,將由下列任一因素觸發:物件刪除–每當從ActiveDirectory中刪除物件時,都會記錄事件ID為4660的安全事件。手動變更–當使用者或管理員手動變更物件的權限時,可能會產生事件ID4660。變更權限設定、修改存取等級或新增或刪除人員或群組時,可能會發生這種情

在iPhone鎖定畫面上取得即將到來的日曆事件 在iPhone鎖定畫面上取得即將到來的日曆事件 Dec 01, 2023 pm 02:21 PM

在運行iOS16或更高版本的iPhone上,您可以直接在鎖定畫面上顯示即將到來的日曆事件。繼續閱讀以了解它是如何完成的。由於錶盤複雜功能,許多AppleWatch用戶習慣能夠看一眼手腕來查看下一個即將到來的日曆事件。隨著iOS16和鎖定螢幕小部件的出現,您可以直接在iPhone上查看相同的日曆事件訊息,甚至無需解鎖設備。日曆鎖定螢幕小元件有兩種風格,可讓您追蹤下一個即將發生的事件的時間,或使用更大的小元件來顯示事件名稱及其時間。若要開始新增小元件,請使用面容ID或觸控ID解鎖iPhone,長按

深入聊聊Node中的File模組 深入聊聊Node中的File模組 Apr 24, 2023 pm 05:49 PM

文件模組是對底層文件操作的封裝,例如文件讀寫/打開關閉/刪除添加等等文件模組最大的特點就是所有的方法都提供的**同步**和**異步**兩個版本,具有sync 字尾的方法都是同步方法,沒有的都是異

一起聊聊Node中的事件循環 一起聊聊Node中的事件循環 Apr 11, 2023 pm 07:08 PM

事件循環是 Node.js 的基本組成部分,透過確保主執行緒不被阻塞來實現非同步編程,了解事件循環對建立高效應用程式至關重要。以下這篇文章就來帶大家深入了解Node中的事件循環 ,希望對大家有幫助!

深入了解Node中的Buffer 深入了解Node中的Buffer Apr 25, 2023 pm 07:49 PM

一開始的時候 JS 只在瀏覽器端運行,對於 Unicode 編碼的字串容易處理,但對於二進位和非 Unicode 編碼的字串處理困難。並且二進制是電腦最底層的資料格式,視訊/音訊/程式/網路包

在JavaScript中,'oninput'事件的用途是什麼? 在JavaScript中,'oninput'事件的用途是什麼? Aug 26, 2023 pm 03:17 PM

當輸入框中新增值時,就會發生oninput事件。您可以嘗試執行以下程式碼來了解如何在JavaScript中實現oninput事件-範例<!DOCTYPEhtml><html>  <body>   <p>Writebelow:</p>   <inputtype="text&quot

See all articles