多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

中國最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2

nodejs教程

Node.js 事件

閱讀 (2340)

Node.js 事件

Node.js 所有的異步I/O 操作在完成時都會發送一個事件到事件隊列。

Node.js里面的許多對象都會分發事件:一個net.Server對象會在每次有新連接時分發一個事件, 一個fs.readStream對象會在文件被打開的時候發出一個事件。 所有這些產生事件的對象都是 events.EventEmitter 的實例。 你可以通過require("events");來訪問該模塊。

下面我們用一個簡單的例子說明 EventEmitter 的用法:
//event.js 
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
    console.log('some_event occured.'); 
}); 
setTimeout(function() { 
    event.emit('some_event'); 
}, 1000); 

運行這段代碼,1秒后控制臺輸出了 'some_event occured'。其原理是 event 對象 注冊了事件 some_event 的一個監聽器,然后我們通過 setTimeout 在1000毫秒以后向 event 對象發送事件 some_event,此時會調用some_event 的監聽器。


EventEmitter介紹

events 模塊只提供了一個對象: events.EventEmitter。EventEmitter 的核心就 是事件發射與事件監聽器功能的封裝。

EventEmitter 的每個事件由一個事件名和若干個參 數組成,事件名是一個字符串,通常表達一定的語義。對于每個事件,EventEmitter 支持 若干個事件監聽器。

當事件發射時,注冊到這個事件的事件監聽器被依次調用,事件參數作 為回調函數參數傳遞。

讓我們以下面的例子解釋這個過程:

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
 console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'byvoid', 1991); 

運行的結果是:

listener1 byvoid 1991 
listener2 byvoid 1991 

以上例子中,emitter 為事件 someEvent 注冊了兩個事件監聽器,然后發射了 someEvent 事件。運行結果中可以看到兩個事件監聽器回調函數被先后調用。 這就是EventEmitter最簡單的用法。

EventEmitter常用的API

EventEmitter.on(event, listener)、emitter.addListener(event, listener) 為指定事件注冊一個監聽器,接受一個字 符串 event 和一個回調函數 listener。

server.on('connection', function (stream) {
  console.log('someone connected!');
});
EventEmitter.emit(event, [arg1], [arg2], [...]) 發射 event 事件,傳 遞若干可選參數到事件監聽器的參數表。

EventEmitter.once(event, listener) 為指定事件注冊一個單次監聽器,即 監聽器最多只會觸發一次,觸發后立刻解除該監聽器。

server.once('connection', function (stream) {
  console.log('Ah, we have our first user!');
});

EventEmitter.removeListener(event, listener) 移除指定事件的某個監聽 器,listener 必須是該事件已經注冊過的監聽器。

var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);

EventEmitter.removeAllListeners([event]) 移除所有事件的所有監聽器, 如果指定 event,則移除指定事件的所有監聽器。


error 事件

EventEmitter 定義了一個特殊的事件 error,它包含了"錯誤"的語義,我們在遇到 異常的時候通常會發射 error 事件。

當 error 被發射時,EventEmitter 規定如果沒有響 應的監聽器,Node.js 會把它當作異常,退出程序并打印調用棧。

我們一般要為會發射 error 事件的對象設置監聽器,避免遇到錯誤后整個程序崩潰。例如:

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.emit('error'); 

運行時會顯示以下錯誤:

node.js:201 
throw e; // process.nextTick error, or 'error' event on first tick 
^ 
Error: Uncaught, unspecified 'error' event. 
at EventEmitter.emit (events.js:50:15) 
at Object. (/home/byvoid/error.js:5:9) 
at Module._compile (module.js:441:26) 
at Object..js (module.js:459:10) 
at Module.load (module.js:348:31) 
at Function._load (module.js:308:12) 
at Array.0 (module.js:479:10) 
at EventEmitter._tickCallback (node.js:192:40) 

繼承 EventEmitter

大多數時候我們不會直接使用 EventEmitter,而是在對象中繼承它。包括 fs、net、 http 在內的,只要是支持事件響應的核心模塊都是 EventEmitter 的子類。

為什么要這樣做呢?原因有兩點:

首先,具有某個實體功能的對象實現事件符合語義, 事件的監聽和發射應該是一個對象的方法。

其次JavaScript 的對象機制是基于原型的,支持 部分多重繼承,繼承 EventEmitter 不會打亂對象原有的繼承關系。

關閉
程序員人生
主站蜘蛛池模板: 亚洲第一中文 | 亚洲免费中文 | 视频三区精品中文字幕 | 爱操成人网 | 在线观看视频一区二区 | 老司机午夜免费福利视频 | 中文字幕第233页 | 精品国产一区二区三区免费 | 99久久老司机免费精品免费 | 成人做爰免费视频免费看 | 国产毛片片精品天天看视频 | 国产在线一区二区视频 | 久久国产精品高清一区二区三区 | 欧美成人h版在线观看 | 亚洲日本韩国在线 | 欧美一级视频在线观看欧美 | 亚洲高清在线观看 | 国产免费a v吧在线观看不卡 | 久久99国产精一区二区三区! | 国产精品亚洲二区 | 午夜毛片福利 | 国产精品v欧美精品v日本精 | 国产高清精品一区 | 亚洲乱码视频在线观看 | 色噜噜视频影院 | 黄网站免费大全 | 韩国午夜理伦三级2020豆豌 | fxxxx性欧美高清 | 成人影院wwwwwwwwwww | 欧美xxxx精品另类 | 国产一级淫片a视频免费观看 | 亚洲 欧美 日韩在线 | 亚洲综合视频在线观看 | 成人77777| 午夜理伦三级播放 | 国产一级淫片免费大片 | 男女啪啪成人免费网站 | 亚洲精品一区二区三区婷婷月 | 国产亚洲高清在线精品不卡 | 老司机精品视频午夜免费视频 | 国产欧美在线观看视频 |