《Node.js》之事件處理機制

1、Node.js中的事件

Node.js中的JavaScript與運行在瀏覽器中的JavaScript類似,在程序執行的時候也會觸發一些事件,例如:“服務器接收到客戶端的請求”,“運行產生錯誤”,“斷開連接”等事件。在Node.js中會根據不同的事件,進行相應的處理。

《Node.js》之事件處理機制

2、EventEmitter類

Node.js中的event模塊是用於處理各種事件的模塊。在event模塊中定義了EventEmitter類,所有可以觸發事件的對象,都是繼承了EventEmitter類的子類的實例對象。在EventEmitter類中定義了很多與對象的事件處理函數綁定和解除相關處理需要用到的方法。

3、EventEmitter類中的方法

on()方法和addListener()方法

on()方法和addListener()方法的功能和內部實現過程是相同的,只是方法名稱不同。這兩個方法都可以用來為指定的事件名稱綁定事件處理函數。使用on()方法綁定事件,程序示例:

var http = require('http');	//引入http模塊
var server = http.createServer(); //通過createServer()方法創建http服務器
/*
*為server服務器在接收到來自客戶端請求時觸發的request事件綁定事件處理函數
*/
server.on('request', function(request, response){
console.log('使用on()方法綁定事件:');
console.log(request.url);
response.end();
});
server.listen(8000, '127.0.0.1');

使用addListener()方法綁定事件,程序示例:

var http = require('http');	//引入http模塊
var server = http.createServer(); //通過createServer()方法創建http服務器
/*
*為server服務器在接收到來自客戶端請求時觸發的request事件綁定事件處理函數
*/
server.on('request', function(request, response){
/*
*使用addListener()方法綁定事件
*/
server.addListener('request', function(request, response){
console.log('使用addListener()方法綁定事件:');
console.log(request.url);
response.end();
});
});
server.listen(8000, '127.0.0.1');

在實際開發過程中可以使用on()方法給一個事件綁定多個不同的事件處理函數,程序示例:

var http = require('http');
var server = http.createServer();
server.on('request', function(request, response){
if(request.url !== '/favicon.ico'){
console.log('服務器端接收到客戶端的請求。');
}
});
server.on('request', function(request, response){
if(request.url !== '/favicon.ico'){
console.log(request.url);
}
response.end();
});
server.on('request', function(request, response){
if(request.url !== '/favicon.ico'){
console.log('發送響應完畢。');
}
response.end();
});

server.listen(8000, '127.0.0.1');

程序運行截圖:

《Node.js》之事件處理機制

once()方法

once()與on()方法類似,也可以為指定的事件名稱綁定事件處理函數,但是使用once()方法為指定的事件名稱綁定事件處理函數只綁定一次。程序示例:

var http = require('http');
var server = http.createServer();
//使用once()方法讓綁定的事件函數只執行一次
server.once('request', function(request, response){
if(request.url !== '/favicon.ico'){
console.log('服務器端已經接收到客戶端請求。');
}
});
server.on('request', function(request, response){
if(request.url !== '/favicon.ico'){
console.log(request.url);
}
response.end();
});
//使用once()方法讓事件處理函數只執行一次
server.once('request', function(request, response){
if(request.url !== '/favicon.ico'){
console.log('發送響應完畢。');
}
});
server.listen(8000, '127.0.0.1');

程序運行截圖:

《Node.js》之事件處理機制

removeListener()方法

使用removeListener()方法可以移除指定事件名稱的事件處理函數。使用removeListener()方法移除指定事件的事件處理函數,程序示例:

var http = require('http');
var server = http.createServer();
var testFunction = function(request, response){
if(request.url !== '/favicon.ico'){
console.log('發送響應完畢。');
}
}
//為request事件綁定多個事件處理函數
server.on('request', function(request, response){
if(request.url !== '/favicon.ico'){
console.log('接收到客戶端的請求。');
}
});
server.on('request', function(request, response){
if(request.url !== '/favicon.ico'){
console.log(request.url);
}
response.end();
});
server.on('request', testFunction);
server.removeListener('request', testFunction);
server.listen(8000, '127.0.0.1');

removeAllListeners()方法

removeAllListeners()方法可以移除指定事件名稱的所有已經綁定事件。程序示例:

var http = require('http');
var server = http.createServer();
var testFunction = function(request, response){
if(request.url !== '/favicon.ico'){
console.log('發送響應完畢。');

}
}
//為request事件綁定多個事件處理函數
server.on('request', function(request, response){
if(request.url !== '/favicon.ico'){
console.log('接收到客戶端的請求。');
}
});
server.on('request', function(request, response){
if(request.url !== '/favicon.ico'){
console.log(request.url);
}
response.end();
});
server.on('request', testFunction);
server.removeAllListener('request');
server.on('request', function(request, response){
if(request.url !== '/favicon.ico'){
console.log('Hello.');
}
response.end();
});
server.listen(8000, '127.0.0.1');

emit()方法

emit()方法可以用於手動觸發一個事件,emit()方法中可以有一個或者多個參數,第一個參數表示被手動觸發的事件名稱,從第二個參數開始表示傳遞給事件處理函數的參數。程序示例:

var http = require('http');
var server = http.createServer();
server.on('request', function(request, response){
if(request.url !== '/favicon.ico'){
console.log(request.url);
}
response.end();
});
server.on('myEvent', function(arg1, arg2, arg3){
console.log('自定義事件被觸發。');

console.log(arg1);
console.log(arg2);
console.log(arg3);
});
server.emit('myEvent', 'Hello', 'World', '.');
server.listen(8000, '127.0.0.1');

對前端的技術,架構技術感興趣的同學關注我的頭條號,並在後臺私信發送關鍵字:“前端”即可獲取免費的架構師學習資料

知識體系已整理好,歡迎免費領取。還有面試視頻分享可以免費獲取。關注我,可以獲得沒有 的架構經驗哦!!


分享到:


相關文章: