Node.js(十)——NodeJs事件-創(chuàng)新互聯(lián)

NodeJs的事件模塊

成都創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、靖遠(yuǎn)網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5場景定制商城網(wǎng)站定制開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為靖遠(yuǎn)等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

在爬蟲代碼中有個on('data')事件,為什么響應(yīng)的res回有一個on方法呢,那這個on做什么事情呢,要回答這些問題,要從事件模塊說起,在NodeJs中不存在瀏覽器中的冒泡、捕獲這些行為的,所以NodeJs中實現(xiàn)的events這個模塊,里面的大多數(shù)模塊都集成了這個模塊,

所以events是最重要的一個模塊,它只對外暴露了一個對象,就是eventImit,作用有兩個分別是事件的發(fā)射,和事件的監(jiān)聽,兩個不同的執(zhí)行環(huán)節(jié)本來是毫無聯(lián)系的,但是有了事件模塊的支持以后,這兩個環(huán)節(jié)就能建立起聯(lián)系,eventImit支持多個事件監(jiān)聽器,大值是10個,

就是在某個事件添加10個事件監(jiān)聽器;

var EventEmitter = require('events').EventEmitter

var life = new EventEmitter()

//addEventListener
life.on('求安慰',function(who){
	console.log('給'+who+'放水')
})

life.on('求安慰',function(who){
	console.log('給'+who+'揉肩')
})

life.on('求安慰',function(who){
	console.log('給'+who+'做飯')
})

life.on('求安慰',function(who){
	console.log('給'+who+'洗衣服')
})

life.on('求安慰',function(who){
	console.log('給'+who+'。。。。。。。。5')
})

life.on('求安慰',function(who){
	console.log('給'+who+'。。。。。。。。6')
})

life.on('求安慰',function(who){
	console.log('給'+who+'。。。。。。。。7')
})

life.on('求安慰',function(who){
	console.log('給'+who+'。。。。。。。。8')
})

life.on('求安慰',function(who){
	console.log('給'+who+'。。。。。。。。9')
})

life.on('求安慰',function(who){
	console.log('給'+who+'。。。。。。。。10')
})
//觸發(fā)
life.emit('求安慰','漢子')

運(yùn)行結(jié)果如下:

Node.js(十)——NodeJs事件

如果綁定的事件多于10個呢,會怎樣?

life.on('求安慰',function(who){
	console.log('給'+who+'你想累死我啊')
})

執(zhí)行結(jié)果如下:

Node.js(十)——NodeJs事件

第11個監(jiān)聽器還是會執(zhí)行的,但是會拋出了一個警告,那這個就是官方建議的,對于一個事件設(shè)置不要超過10個監(jiān)聽器,太多的話會導(dǎo)致內(nèi)存的泄露,當(dāng)然這個值是可以修改的,

那我們?nèi)バ薷囊幌率录淌艿臉O限:

life.setMaxListeners(11)

//添加在new對象之后,on之前

執(zhí)行效果如下:

Node.js(十)——NodeJs事件

如果我對life注冊另外一個事件,會不會占用這個大值?

代碼如下:

life.on('求關(guān)愛',function(who){
	console.log('給'+who+'買衣服')
})
life.on('求關(guān)愛',function(who){
	console.log('給'+who+'交工資')
})

運(yùn)行結(jié)果如下:

Node.js(十)——NodeJs事件

從運(yùn)行結(jié)果發(fā)現(xiàn):如果沒有emit求關(guān)愛事件是不會觸發(fā)監(jiān)聽函數(shù)的,

不是為所有事件統(tǒng)一分配的,只是為求安慰事件分配11個額度。

查看一個事件是否被監(jiān)聽過?

根據(jù)監(jiān)聽事件的返回值是個boolean類型

var flag1 = life.emit('求安慰','漢子')
var flag2 = life.emit('求關(guān)愛','妹子')
var flag3 = life.emit('求什么','漢子和漢子')

console.log(flag1);
console.log(flag2);
console.log(flag3);

運(yùn)行結(jié)果如下:

Node.js(十)——NodeJs事件

如何移除一個事件呢?

錯誤的寫法:寫在事件觸發(fā)emit之前

life.removeListener('求安慰',function(){
	console.log('給'+who+'放水')
})

運(yùn)行結(jié)果如下:

Node.js(十)——NodeJs事件

說明沒有起作用。

那我們應(yīng)該怎么寫呢?匿名函數(shù)這種形式是不行的,需要寫具名的函數(shù)。

改造如下:

function water(who){
	console.log('給'+who+'放水')
}

//addEventListener
life.on('求安慰',water)

//移除
life.removeListener('求安慰',water)

運(yùn)行結(jié)果如下:

Node.js(十)——NodeJs事件

移除事件成功。

查詢剩余的事件監(jiān)聽數(shù)?

console.log(life.listeners('求安慰').length)
console.log(EventEmitter.listenerCount(life,'求安慰'))

結(jié)果如下:

Node.js(十)——NodeJs事件

移除全部的監(jiān)聽:包括求關(guān)愛、求安慰的

life.removeAllListeners()

運(yùn)行結(jié)果如下:

Node.js(十)——NodeJs事件

如果只想移除求安慰的,這個時候就需要傳遞具體的事件的名字的,

例如:

life.removeAllListeners('求安慰')

運(yùn)行結(jié)果如下:

Node.js(十)——NodeJs事件

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

分享題目:Node.js(十)——NodeJs事件-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://www.muchs.cn/article20/dodeco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站收錄小程序開發(fā)、Google、ChatGPT、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司