首頁  >  文章  >  web前端  >  node.js中的事件處理機制詳解

node.js中的事件處理機制詳解

高洛峰
高洛峰原創
2016-12-05 10:59:421060瀏覽

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");

   node.js中的事件處理機制詳解

在這段程式碼中,我們指定當伺服器接收到客戶端請求時,在你控制台視窗中輸出客戶端請求的目標的URL位址,並使用回應物件的end方法立即結束回應。

執行程式碼,然後在瀏覽器視窗中輸入:http://localhost:1337://,控制台輸出如下:

控制台輸出

node.js中的事件處理機制詳解當然,也可以透過多個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,執行程式碼,控制台輸出如下:


控制台輸出

node.js中的事件處理機制詳解另外,在預設情況下,針對同一個指定事件,最多可以綁定10個時間處理函數。可以透過setMaxListeners方法修改最多可以綁定的事件處理函數數量,方法如下:

emitter.setMaxListeners(n)

   

EventEmitter類別的once方法

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,控制台輸出如下:

node.js中的事件處理機制詳解


node.js中的事件處理機制詳解


🜎

接著將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次! node.js中的事件處理機制詳解

使用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");

 這次不在瀏覽器視窗中輸入位址,直接執行程式碼檢視控制台輸出,控制台輸出如下:node.js中的事件處理機制詳解


控制台輸出,控制台輸出如下:

控制台輸出

說明我們手動觸發了自訂事件,也就是customEvent。


總結

🎜以上就是這篇文章的全部內容了,希望本文的內容對大家學習或使用node.js能有所幫助🎜🎜🎜🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn