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