首頁 >web前端 >js教程 >聊聊Node.js中的事件驅動程式和EventEmitter類

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

青灯夜游
青灯夜游轉載
2021-11-18 18:57:252246瀏覽

這篇文章帶大家了解一下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 的用法:<pre class="brush:js;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>執行結果如下:運行這段程式碼,1 秒後控制台輸出了

'some_event 事件觸發'

。其原則是 event 物件註冊了事件 some_event 的監聽器,然後我們透過 setTimeout 在 1000 毫秒以後向 event 物件發送事件 some_event,此時會呼叫some_event 的監聽器。 <pre class="brush:html;toolbar:false;">$ node event.js some_event 事件触发</pre>

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中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除