EventEmitter類
在Node.js的用于實現各種事件處理的event模塊中,定義了一個EventEmitter類。所有可能觸發事件的對象都是一個集成了EventEmitter類的子類的實例對象,在Node.js中,為EventEmitter類定義了許多方法,所有與對象的事件處理函數的綁定及解除相關的處理均依靠這些方法的調用來執行。
EventEmitter類的各種方法
event:代表事件名
listener:代表事件處理函數
中括號內的參數代表該參數為可選參數
| 方法名與參數 | 描述 |
| addListener(event,listener) | 對指定事件綁定事件處理函數 |
| on(event, listener) | 對指定事件綁定事件處理函數(addListener方法的別名) |
| once(event, listener) | 對指定事件指定只執行一次的事件處理函數 |
| removeListener(event, listener) | 對指定事件接觸事件處理函數 |
| setMaxListeners(n) | 指定事件處理函數的最大數量,n為正數值,代表最大的可指定事件處理函數的數量 |
| listeners(event) | 獲取指定事件的所有事件處理函數 |
| emit(event, [arg1], [arg2], [...]) | 手工觸發指定事件 |
EventEmitter類的on方法
var http = require("http");var server = http.createServer();server.on("request", function(req, res){ console.log(req.url); res.end();});server.listen(1337, "127.0.0.1");在這段代碼中,我們指定當服務器接收到客戶端請求時,在你控制臺窗口中輸出客戶端請求的目標的URL地址,并使用響應對象的end方法立即結束響應。
執行代碼,然后在瀏覽器窗口中輸入:http://localhost:1337://,控制臺輸出如下:

控制臺輸出
當然,也可以通過多個on方法的執行來對同一個事件綁定多個事件處理函數。如下:
var http = require("http");var server = http.createServer();server.on('request', function(req, res){ console.log('接收到客戶端請求')})server.on("request", function(req, res){ console.log('處理客戶端請求') console.log(req.url); res.end();})server.on('request', function(req, res){ console.log('發送響應完畢')})server.listen(1337, "127.0.0.1");OK,執行代碼,控制臺輸出如下:

控制臺輸出
另外,在默認情況下,針對同一個指定事件,最多可以綁定10個時間處理函數。可以通過setMaxListeners方法修改最多可以綁定的事件處理函數數量,方法如下:
emitter.setMaxListeners(n)
EventEmitter類的once方法
EventEmiiter類的once方法與on方法類似,作用均為對指定事件綁定事件處理函數,區別在于,當事件處理函數執行一次后立即被接觸,即該事件處理函數只會被執行一次。once方法所用參數與on方法所用參數相同,如下:
emitter.once(event, listener)
做個試驗。
還是執行如下代碼(同上):
var http = require("http");var server = http.createServer();server.on('request', function(req, res){ console.log('接收到客戶端請求')})server.on("request", function(req, res){ console.log('處理客戶端請求') console.log(req.url); res.end();})server.on('request', function(req, res){ console.log('發送響應完畢')})server.listen(1337, "127.0.0.1");然后,在瀏覽器窗口中連續打開兩次127.0.0.1:1337,控制臺輸出如下:

顯示了兩次
然后將on事件修改為once事件,代碼如下:
var http = require("http");var server = http.createServer();server.once('request', function(req, res){ console.log('接收到客戶端請求')})server.on("request", function(req, res){ console.log('處理客戶端請求') console.log(req.url); res.end();})server.once('request', function(req, res){ console.log('發送響應完畢')})server.listen(1337, "127.0.0.1");控制臺輸出如下:

請求處理2次,其余只打印1次!
使用removeListener方法取消事件處理函數
代碼如下:
var http = require("http");var server = http.createServer();var testFunction = function (req,res) { console.log('發送響應完畢')}server.on('request', function(req, res){ console.log('接收到客戶端請求')})server.on("request", function(req, res){ console.log('處理客戶端請求') console.log(req.url); res.end();})server.on('request', testFunction)//刪除server.removeListener('request', testFunction)server.listen(1337, "127.0.0.1");運行代碼,在瀏覽器窗口輸入127.0.0.1:1337,控制臺輸出如下

控制臺輸出
emit方法:自定義事件并將其觸發
代碼如下:
var http = require("http");var server = http.createServer();server.on("request", function(req, res){ console.log(req.url);});//自定義事件server.on("customEvent", function(arg1, arg2, arg3){ console.log("自定義事件被觸發"); console.log(arg1); console.log(arg2); console.log(arg3);});//觸發自定義事件server.emit('customEvent', '自定義參數1', '自定義參數2', '自定義參數3')server.listen(1337, "127.0.0.1");這次不在瀏覽器窗口中輸入地址,直接運行代碼查看控制臺輸出,控制臺輸出如下:

控制臺輸出
說明我們手動觸發了自定義事件,也就是customEvent。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家學習或者使用node.js能有所幫助,如果有疑問大家可以留言交流。
新聞熱點
疑難解答