首頁 > web前端 > js教程 > 主體

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

青灯夜游
發布: 2021-11-25 09:20:12
轉載
2058 人瀏覽過

這篇文章帶大家了解一下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 的用法:

//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
    console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 
    event.emit('some_event'); 
}, 1000);
登入後複製
執行結果如下:運行這段程式碼,1 秒後控制台輸出了

'some_event 事件觸發'

。其原則是 event 物件註冊了事件 some_event 的監聽器,然後我們透過 setTimeout 在 1000 毫秒以後向 event 物件發送事件 some_event,此時會呼叫some_event 的監聽器。

$ node event.js 
some_event 事件触发
登入後複製

EventEmitter

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

//event.js 文件
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');
登入後複製
執行以上程式碼,運行的結果如下:
$ 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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!