節點事件發射器

如何在Node中處理自定義事件

如果您在瀏覽器中使用JavaScript,您將知道通過事件處理了用戶多少交互:鼠標單擊,鍵盤按鈕按下,對鼠標移動做出反應,等等。

在後端,Node為我們提供了使用以下選項構建類似系統的選項:events模塊

特別是,此模塊提供了EventEmitter類,我們將使用它來處理事件。

您可以使用以下語法初始化EventEmitter對象:

const EventEmitter = require('events')
const eventEmitter = new EventEmitter()

除其他外,該對像還暴露了onemit方法。

  • emit用於觸發事件
  • on用於添加將在事件觸發時執行的回調函數

發射並監聽事件

例如,讓我們創建一個start事件,並提供一個示例,我們只需登錄控制台即可對此做出反應:

eventEmitter.on('start', () => {
  console.log('started')
})

當我們跑步

eventEmitter.emit('start')

事件處理函數被觸發,我們得到控制台日誌。

addListener()是的別名on(),以防您看到使用過的內容。

將參數傳遞給事件

您可以將參數作為附加參數傳遞給事件處理程序,以將其傳遞給事件處理程序。emit()

eventEmitter.on('start', (number) => {
  console.log(`started ${number}`)
})

eventEmitter.emit(‘start’, 23)

多個參數:

eventEmitter.on('start', (start, end) => {
  console.log(`started from ${start} to ${end}`)
})

eventEmitter.emit(‘start’, 1, 100)

聽一次活動

EventEmitter對像還公開了once()方法,可用於創建一次性事件偵聽器。

觸發該事件後,偵聽器將停止偵聽。

例子:

eventEmitter.once('start', () => {
  console.log(`started!`)
})

eventEmitter.emit(‘start’) eventEmitter.emit(‘start’) //not going to fire

刪除事件監聽器

創建事件監聽器後,您可以使用removeListener()方法。

為此,我們必須首先具有對的回調函數的引用on

在此示例中:

eventEmitter.on('start', () => {
  console.log('started')
})

提取回調:

const callback = () => {
  console.log('started')
}

eventEmitter.on(‘start’, callback)

這樣以後您可以打電話

eventEmitter.removeListener('start', callback)

您還可以使用以下方法一次刪除一個事件中的所有偵聽器:

eventEmitter.removeAllListeners('start')

登記事件

eventNames()在EventEmitter對象實例上調用的方法,返回一個字符串數組,這些字符串表示在當前EventListener上註冊的事件:

const EventEmitter = require('events')
const eventEmitter = new EventEmitter()

eventEmitter.on(‘start’, () => { console.log(‘started’) })

eventEmitter.eventNames() // [ ‘start’ ]

listenerCount()返回作為參數傳遞的事件的偵聽器計數:

eventEmitter.listenerCount('start') //1

在其他聽眾之前/之後添加更多聽眾

如果您有多個偵聽器,則它們的順序可能很重要。

EventEmitter對象實例提供了一些處理訂單的方法。

emitter.prependListener()

當您使用添加監聽器時on或者addListener,它被添加到偵聽器隊列的末尾,並被稱為末尾。使用prependListener它是在其他偵聽器之前添加和調用的。

emitter.prependOnceListener()

當您使用添加監聽器時once,它被添加到偵聽器隊列的末尾,並被稱為末尾。使用prependOnceListener它是在其他偵聽器之前添加和調用的。

免費下載我的Node.js手冊


更多節點教程: