這篇文章帶大家了解一下Node中的事件,聊聊一下事件驅動程式和EventEmitter 類,希望對大家有幫助!
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); } })
接下來讓我們執行以上程式碼:
#events
模組只提供了一個物件:
。
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(&#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>
執行結果如下:運行這段程式碼,1 秒後控制台輸出了
。其原則是 event 物件註冊了事件 some_event 的監聽器,然後我們透過 setTimeout 在 1000 毫秒以後向 event 物件發送事件 some_event,此時會呼叫some_event 的監聽器。 <pre class="brush:html;toolbar:false;">$ node event.js
some_event 事件触发</pre>
的每個事件由一個事件名和若干個參數組成,事件名是一個字串,通常表達一定的語意。對於每個事件,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 参数
以上例子中,
為事件someEvent 註冊了兩個事件監聽器,然後觸發了
someEvent ###事件。 ######運行結果中可以看到兩個事件監聽器回呼函數先後呼叫。這就是###EventEmitter###最簡單的用法。 #########EventEmitter### 提供了多個屬性,如 ###on### 和 ###emit###。 ###on### 函數用於綁定事件函數,###emit### 屬性用於觸發一個事件。 ######更多node相關知識,請造訪:###nodejs 教學###! ! ###以上是聊聊Node.js中的事件驅動程式和EventEmitter類的詳細內容。更多資訊請關注PHP中文網其他相關文章!