node.js中的事件處理機制詳解
EventEmitter類
在Node.js的用于實現(xiàn)各種事件處理的event模塊中,定義了一個EventEmitter類。所有可能觸發(fā)事件的對象都是一個集成了EventEmitter類的子類的實例對象,在Node.js中,為EventEmitter類定義了許多方法,所有與對象的事件處理函數(shù)的綁定及解除相關(guān)的處理均依靠這些方法的調(diào)用來執(zhí)行。
EventEmitter類的各種方法
event:代表事件名
listener:代表事件處理函數(shù)
中括號內(nèi)的參數(shù)代表該參數(shù)為可選參數(shù)
| 方法名與參數(shù) | 描述 |
| addListener(event,listener) | 對指定事件綁定事件處理函數(shù) |
| on(event, listener) | 對指定事件綁定事件處理函數(shù)(addListener方法的別名) |
| once(event, listener) | 對指定事件指定只執(zhí)行一次的事件處理函數(shù) |
| removeListener(event, listener) | 對指定事件接觸事件處理函數(shù) |
| setMaxListeners(n) | 指定事件處理函數(shù)的最大數(shù)量,n為正數(shù)值,代表最大的可指定事件處理函數(shù)的數(shù)量 |
| listeners(event) | 獲取指定事件的所有事件處理函數(shù) |
| emit(event, [arg1], [arg2], [...]) | 手工觸發(fā)指定事件 |
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");
在這段代碼中,我們指定當服務(wù)器接收到客戶端請求時,在你控制臺窗口中輸出客戶端請求的目標的URL地址,并使用響應(yīng)對象的end方法立即結(jié)束響應(yīng)。
執(zhí)行代碼,然后在瀏覽器窗口中輸入:http://localhost:1337://,控制臺輸出如下:

控制臺輸出
當然,也可以通過多個on方法的執(zhí)行來對同一個事件綁定多個事件處理函數(shù)。如下:
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('發(fā)送響應(yīng)完畢')
})
server.listen(1337, "127.0.0.1");
OK,執(zhí)行代碼,控制臺輸出如下:

控制臺輸出
另外,在默認情況下,針對同一個指定事件,最多可以綁定10個時間處理函數(shù)??梢酝ㄟ^setMaxListeners方法修改最多可以綁定的事件處理函數(shù)數(shù)量,方法如下:
emitter.setMaxListeners(n)
EventEmitter類的once方法
EventEmiiter類的once方法與on方法類似,作用均為對指定事件綁定事件處理函數(shù),區(qū)別在于,當事件處理函數(shù)執(zhí)行一次后立即被接觸,即該事件處理函數(shù)只會被執(zhí)行一次。once方法所用參數(shù)與on方法所用參數(shù)相同,如下:
emitter.once(event, listener)
做個試驗。
還是執(zhí)行如下代碼(同上):
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('發(fā)送響應(yīng)完畢')
})
server.listen(1337, "127.0.0.1");
然后,在瀏覽器窗口中連續(xù)打開兩次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('發(fā)送響應(yīng)完畢')
})
server.listen(1337, "127.0.0.1");
控制臺輸出如下:

請求處理2次,其余只打印1次!
使用removeListener方法取消事件處理函數(shù)
代碼如下:
var http = require("http");
var server = http.createServer();
var testFunction = function (req,res) {
console.log('發(fā)送響應(yīng)完畢')
}
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方法:自定義事件并將其觸發(fā)
代碼如下:
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("自定義事件被觸發(fā)");
console.log(arg1);
console.log(arg2);
console.log(arg3);
});
//觸發(fā)自定義事件
server.emit('customEvent', '自定義參數(shù)1', '自定義參數(shù)2', '自定義參數(shù)3')
server.listen(1337, "127.0.0.1");
這次不在瀏覽器窗口中輸入地址,直接運行代碼查看控制臺輸出,控制臺輸出如下:

控制臺輸出
說明我們手動觸發(fā)了自定義事件,也就是customEvent。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家學習或者使用node.js能有所幫助,如果有疑問大家可以留言交流。
相關(guān)文章
nodejs 整合kindEditor實現(xiàn)圖片上傳
這篇文章主要介紹了nodejs 整合kindEditor實現(xiàn)圖片上傳,需要的朋友可以參考下2015-02-02
nodejs 圖解express+supervisor+ejs的用法(推薦)
下面小編就為大家?guī)硪黄猲odejs 圖解express+supervisor+ejs的用法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
nodejs部署到騰訊云服務(wù)器的實現(xiàn)(寶塔面板linux系統(tǒng))
本文主要介紹了nodejs部署到騰訊云服務(wù)器的實現(xiàn)(寶塔面板linux系統(tǒng)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06
NodeJs使用Mysql模塊實現(xiàn)事務(wù)處理實例
本篇文章主要介紹了NodeJs使用Mysql模塊實現(xiàn)事務(wù)處理 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05

