# 事件 (Events)
~~~
穩(wěn)定度: 4 - 凍結(jié)
~~~
Node里面的許多對象都會分發(fā)事件:一個`net.Server`對象會在每次有新連接時分發(fā)一個事件, 一個`fs.readStream`對象會在文件被打開的時候發(fā)出一個事件。 所有這些產(chǎn)生事件的對象都是 `events.EventEmitter` 的實例。 你可以通過`require("events");`來訪問該模塊
通常,事件名是駝峰命名 (camel-cased) 的字符串。不過也沒有強制的要求,任何字符串都是可以使用的。
為了處理發(fā)出的事件,我們將函數(shù) (Function) 關(guān)聯(lián)到對象上。 我們把這些函數(shù)稱為 *監(jiān)聽器 (listeners)*。 在監(jiān)聽函數(shù)中 `this` 指向當(dāng)前監(jiān)聽函數(shù)所關(guān)聯(lián)的 `EventEmitter` 對象。
### 類: events.EventEmitter
通過 `require('events').EventEmitter` 獲取 EventEmitter 類。
當(dāng) `EventEmitter` 實例遇到錯誤,通常的處理方法是產(chǎn)生一個 `'error'` 事件,node 對錯誤事件做特殊處理。 如果程序沒有監(jiān)聽錯誤事件,程序會按照默認(rèn)行為在打印出 棧追蹤信息 (stack trace) 后退出。
EventEmitter 會在添加 listener 時觸發(fā) `'newListener'` 事件,刪除 listener 時觸發(fā) `'removeListener'` 事件
### emitter.addListener(event, listener)
### emitter.on(event, listener)
添加一個 listener 至特定事件的 listener 數(shù)組尾部。
~~~
server.on('connection', function (stream) {
console.log('someone connected!');
});
~~~
返回 emitter,方便鏈?zhǔn)秸{(diào)用。
### emitter.once(event, listener)
添加一個 **一次性** listener,這個 listener 只會在下一次事件發(fā)生時被觸發(fā)一次,觸發(fā)完成后就被刪除。
~~~
server.once('connection', function (stream) {
console.log('Ah, we have our first user!');
});
~~~
返回 emitter,方便鏈?zhǔn)秸{(diào)用。
### emitter.removeListener(event, listener)
從一個事件的 listener 數(shù)組中刪除一個 listener **注意**:此操作會改變 listener 數(shù)組中在當(dāng)前 listener 后的listener 的位置下標(biāo)
~~~
var callback = function(stream) {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
~~~
返回 emitter,方便鏈?zhǔn)秸{(diào)用。
### emitter.removeAllListeners([event])
刪除所有 listener,或者刪除某些事件 (event) 的 listener
返回 emitter,方便鏈?zhǔn)秸{(diào)用。
### emitter.setMaxListeners(n)
在默認(rèn)情況下,EventEmitter 會在多于 10 個 listener 監(jiān)聽某個事件的時候出現(xiàn)警告,此限制在尋找內(nèi)存泄露時非常有用。 顯然,也不是所有的 Emitter 事件都要被限制在 10 個 listener 以下,在這種情況下可以使用這個函數(shù)來改變這個限制。設(shè)置0這樣可以沒有限制。
返回 emitter,方便鏈?zhǔn)秸{(diào)用。
### EventEmitter.defaultMaxListeners
`emitter.setMaxListeners(n)` 設(shè)置每個 emitter 實例的最大監(jiān)聽數(shù)。 這個類屬性為 **所有**`EventEmitter` 實例設(shè)置最大監(jiān)聽數(shù)(對所有已創(chuàng)建的實例和今后創(chuàng)建的實例都將立即生效)。 使用時請注意。
請注意,`emitter.setMaxListeners(n)` 優(yōu)先于 `EventEmitter.defaultMaxListeners`。
### emitter.listeners(event)
返回指定事件的 listener 數(shù)組
~~~
server.on('connection', function (stream) {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection'))); // [ [Function] ]
~~~
### emitter.emit(event, [arg1], [arg2], [...])
使用提供的參數(shù)按順序執(zhí)行指定事件的 listener
若事件有 listeners 則返回 `true` 否則返回 `false`。
### 類方法: EventEmitter.listenerCount(emitter, event)
返回指定事件的 listeners 個數(shù)
### 事件: 'newListener'
- `event` {String} 事件名
- `listener` {Function} 事件處理函數(shù)
在添加 listener 時會發(fā)生該事件。 此時無法確定 `listener` 是否在 `emitter.listeners(event)` 返回的列表中。
### 事件: 'removeListener'
- `event` {String} 事件名
- `listener` {Function} 事件處理函數(shù)
在移除 listener 時會發(fā)生該事件。 此時無法確定 `listener` 是否在 `emitter.listeners(event)` 返回的列表中。
