聊聊Node.js中的事件驅動程式和EventEmitter類
這篇文章帶大家了解一下Node中的事件,聊聊一下事件驅動程式和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); } })
接下來讓我們執行以上程式碼:
##EventEmitter 類別
#events
模組只提供了一個物件:
。
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(&#39;events&#39;).EventEmitter;
var event = new EventEmitter();
event.on(&#39;some_event&#39;, function() {
console.log(&#39;some_event 事件触发&#39;);
});
setTimeout(function() {
event.emit(&#39;some_event&#39;);
}, 1000);</pre><div class="contentsignin">登入後複製</div></div>
執行結果如下:運行這段程式碼,1 秒後控制台輸出了
。其原則是 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>
的每個事件由一個事件名和若干個參數組成,事件名是一個字串,通常表達一定的語意。對於每個事件, 為事件someEvent 註冊了兩個事件監聽器,然後觸發了 以上是聊聊Node.js中的事件驅動程式和EventEmitter類的詳細內容。更多資訊請關注PHP中文網其他相關文章!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 参数

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

基於無阻塞、事件驅動建立的Node服務,具有記憶體消耗低的優點,非常適合處理海量的網路請求。在海量請求的前提下,就需要考慮「記憶體控制」的相關問題了。 1. V8的垃圾回收機制與記憶體限制 Js由垃圾回收機
![事件 ID 4660:已刪除物件 [修復]](https://img.php.cn/upload/article/000/887/227/168834320512143.png?x-oss-process=image/resize,m_fill,h_207,w_330)
我們的一些讀者遇到了事件ID4660。他們通常不確定該怎麼做,所以我們在本指南中解釋。刪除物件時通常會記錄事件ID4660,因此我們還將探索一些實用的方法在您的電腦上修復它。什麼是事件ID4660?事件ID4660與活動目錄中的物件相關,將由下列任一因素觸發:物件刪除–每當從ActiveDirectory中刪除物件時,都會記錄事件ID為4660的安全事件。手動變更–當使用者或管理員手動變更物件的權限時,可能會產生事件ID4660。變更權限設定、修改存取等級或新增或刪除人員或群組時,可能會發生這種情

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

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

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

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

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