Node.js 事件

2022-02-26 10:28 更新
文檔: 4 - API 凍結(jié)

Node里很多對(duì)象會(huì)分發(fā)事件: 每次有連接的時(shí)候net.Server會(huì)分發(fā)事件,當(dāng)文件打開(kāi)的時(shí)候fs.readStream會(huì)分發(fā)事件。所有能分發(fā)事件的對(duì)象都是 events.EventEmitter的實(shí)例。通過(guò)require("events");能訪問(wèn)這個(gè)模塊。

一般來(lái)說(shuō),事件名都遵照駝峰規(guī)則,但這不是強(qiáng)制規(guī)定,任何形式的字符串都可以做為事件名。

為了處理事件,通常將函數(shù)關(guān)聯(lián)到對(duì)象上。這些函數(shù)也叫監(jiān)聽(tīng)者(listeners)。在這個(gè)函數(shù)里,this指向監(jiān)聽(tīng)者所關(guān)聯(lián)的EventEmitter。

類(lèi): events.EventEmitter

你可以通過(guò)require('events').EventEmitter獲取EventEmitter類(lèi)。

EventEmitter實(shí)例遇到錯(cuò)誤后,通常會(huì)觸發(fā)一個(gè)錯(cuò)誤事件。錯(cuò)誤事件在node里是特殊例子。如果沒(méi)有監(jiān)聽(tīng)者,默認(rèn)的操作是打印一個(gè)堆棧信息并退出程序。

當(dāng)添加新的監(jiān)聽(tīng)者時(shí), EventEmitters會(huì)觸發(fā)'newListener'事件,當(dāng)移除時(shí)會(huì)觸發(fā)'removeListener'。

emitter.addListener(event, listener)

emitter.on(event, listener)

添加一個(gè)監(jiān)聽(tīng)者到特定event的監(jiān)聽(tīng)數(shù)組的尾部,觸發(fā)器不會(huì)檢查是否已經(jīng)添加過(guò)這個(gè)監(jiān)聽(tīng)者。 多次調(diào)用相同的eventlistener將會(huì)導(dǎo)致listener添加多次。

server.on('connection', function (stream) {
  console.log('someone connected!');
});

返回emitter。

emitter.once(event, listener)

給事件添加一個(gè)一次性的listener,這個(gè)listener只會(huì)被觸發(fā)一次,之后就會(huì)被移除。

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

返回emitter。

emitter.removeListener(event, listener)

從一個(gè)某個(gè)事件的listener數(shù)組中移除一個(gè)listener。注意,這個(gè)操作會(huì)改變listener數(shù)組內(nèi)容的次序。

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

removeListener最多會(huì)移除數(shù)組里的一個(gè)listener。如果多次添加同一個(gè)listener到數(shù)組,那就需要多次調(diào)用removeListener來(lái)移除每一個(gè)實(shí)例。

返回emitter。

emitter.removeAllListeners([event])

移除所有的listener,或者某個(gè)事件listener。最好不要移除全部listener,尤其是那些不是你傳入的(比如socket或文件流)。

返回emitter。

emitter.setMaxListeners(n)

默認(rèn)情況下,給單個(gè)事件添加超過(guò)10個(gè)listener,事件分發(fā)器會(huì)打印警告。這樣有利于檢查內(nèi)存泄露。不過(guò)不是所有的分發(fā)器都應(yīng)該限制在10個(gè),這個(gè)函數(shù)允許改變 listener數(shù)量,無(wú)論是0還是更多。

返回emitter。

EventEmitter.defaultMaxListeners

emitter.setMaxListeners(n)設(shè)置一個(gè)分發(fā)器的最大listener數(shù),而這個(gè)函數(shù)會(huì)立即設(shè)置所有EventEmitter的當(dāng)前值和默認(rèn)值。要小心使用。

請(qǐng)注意,emitter.setMaxListeners(n)的優(yōu)先級(jí)高于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í)行每一個(gè)listener.

如果事件有 listener,返回true, 否則false

類(lèi)方法: EventEmitter.listenerCount(emitter, event)

返回指定事件的listener數(shù)量。

Event: 'newListener'

  • event{String}事件名
  • listener{Function}事件處理函數(shù)

添加listener的時(shí)候會(huì)觸發(fā)這個(gè)事件。當(dāng)這個(gè)事件觸發(fā)的時(shí)候,listener可能還沒(méi)添加到listener數(shù)組。

Event: 'removeListener'

  • event{String}事件名
  • listener{Function}事件處理函數(shù)

刪除listener的時(shí)候會(huì)觸發(fā)這個(gè)事件。當(dāng)這個(gè)事件觸發(fā)的時(shí)候,listener可能還還沒(méi)從listener數(shù)組移除。


以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)