nodejs中events模組的使用

2021-10-09 03:16:08 字數 4813 閱讀 7741

講events之前我們先用js模擬實現乙個eventemitter類

原始碼

//訂閱者集合

class

eventemitter

}// 訂閱機制

on(name,newlistener)

this

.listener[name]

.push

(newlistener)

}// 發布機制

emit

(name)

}let myemitter =

neweventemitter()

myemitter.on(

'a',message =>console.

log(

`我是1號訂閱者,$`

))myemitter.on(

'a', message =>console.

log(

`我2號訂閱者,$`

))myemitter.on(

'b',message =>console.

log(

`我是3號訂閱者,$`

))myemitter.

emit

('b'

)

什麼是events

建立事件觸發器例項

官方文件示例

const eventemitter =

require

('events');

// 匯出events物件

class

myemitter

extends

eventemitter

//定義了乙個類 繼承了物件的全部方法 (比較雞肋,沒必要)

const myemitter =

newmyemitter()

;// 建立乙個類的例項

為什麼說比較雞肋
const events =

require

('events');

// 匯出events物件

//不難發現 已經存在eventemitter 並且events === events.eventemitter 返回true

//因此我們可以直接使用這個類建立例項

建立乙個事件觸發器例項
//第一種

const events =

require

('events');

const myemitter =

newevents.eventemitter()

;//第二種

const

=require

('events');

const myemitter =

neweventemitter

()

事件觸發器例項的屬性及方法

1.訂閱 myemitter.on(事件名稱,***)

myemitter.on(

'student'

,mes=>console.

log(

`我是訂閱者1號,$`

))

2.發布 myemitter.emit(事件名稱,***)
myemitter.

emit

('student'

,'簽到'

)

3.訂閱myemitter.addlistener(事件名稱,***) (on的等價方法)
myemitter.

addlistener

('student'

,mes=>console.

log(

`我是訂閱者2號,$`

))

4.訂閱 myemitter.once(事件名稱,***) 觸發一次 觸發後移除
myemitter.

once

('student'

,mes=>console.

log(

`我是訂閱者3號,$`

))myemitter.

emit

('student'

,'簽到'

)myemitter.

emit

('student'

,'簽到'

)//不會觸發

5.訂閱 優先觸發 myemitter.prependlistener(事件名稱,***)
myemitter.

prependlistener

('student'

,mes=>console.

log(

`我是訂閱者4號,$`

))

6.訂閱 並優先觸發 myemitter.prependoncelistener(事件名稱,***) 觸發一次 觸發後移除
myemitter.

prependoncelistener

('student'

,mes=>console.

log(

`我是訂閱者5號,$`

))

7.獲取/設定當前事件觸發器例項的***數量
myemitter.

getmaxlisteners()

//獲取

myemitter.

setmaxlisteners

(n)//設定

8.獲取當前觸發器例項註冊的所有事件名
myemitter.

eventnames()

//返回集合

9.獲取指定事件下的所有***
myemitter.

listeners

(事件名稱)

myemitter.

rawlisteners

(事件名稱)

10.獲取指定事件下的所有***數量
myemitter.

listenercount

(事件名稱)

11.移除觸發器例項上繫結的全部***
myemitter.

removealllisteners

()

12.移除指定事件的***
myemitter.

off(事件名稱,***名稱)

myemitter.

removelistener

(事件名稱,***名稱)

靜態屬性 (eventemitter類上的屬性)

定義事件***例項的預設***數量的預設值 eventemitter.defaultmaxlisteners

每乙個觸發器例項 同乙個事件最多繫結10個*** 超出報警告

eventemitter.defaultmaxlisteners =

8

觸發器例項上的內部事件

1.訂閱就會觸發 newlistener

myemitter.on(

'newlistener'

,(eventname,listener)

=>

`,listener)

})

2.移除***會觸發 removelistener
myemitter.on(

'removelistener'

,(eventname,listener)

=>

`,listener)

})

需要注意的是:通過once /prependoncelistener建立的***在發布時會觸發removelistener

實現乙個類似npm命令列視窗登入的效果

原始碼

#!

/usr/bin/env node

const fs =

require

('fs');

const path =

require

('path');

const events =

require

('events'

)const myemitter =

newevents.eventemitter()

;// 使用者資料

const userdata =

json

.parse

(fs.

readfilesync

(path.

join

(__dirname,

'./user.json'),

'utf-8'))

const nowloginuser =

;const question =

[else}}

,else}}

,\n`);

process.

exit()

}else}}

]let index =0;

// 訂閱

myemitter.on(

'nextquestion',(

)=>process.stdout.

write

(question[

++index]

.question)

)process.stdout.

write

(question[0]

.question)

;process.stdin.on(

'data'

,chunk=>question[index]

.deal

(chunk.

tostring()

.trim()

))

有趣的Nodejs模組之events

nodejs 使用了乙個事件驅動 非阻塞 io 的模型。events模組是事件驅動的核心模組。很多內建模組都繼承了events.eventemitter。自己無需手動實現這種設計模式,直接繼承eventemitter即可。如下 const require events class myemitter...

node中的事件 events模組

events模組匯入需要做三步 核心模組是乙個建構函式 const eventemitter require events 繼承 class myeventemitter extends eventemitter 例項化 const myeventemitter new myeventemitter...

nodejs中的模組

nodejs中的模組管理遵循commonjs規範。使用module.exports 可簡寫為exports 匯出模組,使用require來引入模組。例 mymodule.js var myfunction function name module.exports myfunction 也可也成exp...