EventEmitter類別
在Node.js的用於實作各種事件處理的event模組中,定義了一個EventEmitter類別。所有可能觸發事件的對像都是一個整合了EventEmitter類別的子類別的實例對象,在Node.js中,為EventEmitter類別定義了許多方法,所有與對象的事件處理函數的綁定及解除相關的處理均依靠這些方法的呼叫來執行。
EventEmitter類別的各種方法
event:代表事件名稱
listener:代表事件處理函數
中括號內的參數代表此參數為選用參數
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)
EventEmiiter的定事件處理函數,差異在於,當事件處理函數執行一次後立即被接觸,即該事件處理函數只會被執行一次。 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,控制台輸出以下控制台輸出方法。 :自訂事件並觸發
程式碼如下:
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。
總結