您好,登錄后才能下訂單哦!
NodeJs的事件模塊
在爬蟲代碼中有個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('求安慰','漢子')
運行結(jié)果如下:
如果綁定的事件多于10個呢,會怎樣?
life.on('求安慰',function(who){ console.log('給'+who+'你想累死我啊') })
執(zhí)行結(jié)果如下:
第11個監(jiān)聽器還是會執(zhí)行的,但是會拋出了一個警告,那這個就是官方建議的,對于一個事件設(shè)置不要超過10個監(jiān)聽器,太多的話會導(dǎo)致內(nèi)存的泄露,當(dāng)然這個值是可以修改的,
那我們?nèi)バ薷囊幌率录淌艿臉O限:
life.setMaxListeners(11) //添加在new對象之后,on之前
執(zhí)行效果如下:
如果我對life注冊另外一個事件,會不會占用這個最大值?
代碼如下:
life.on('求關(guān)愛',function(who){ console.log('給'+who+'買衣服') }) life.on('求關(guān)愛',function(who){ console.log('給'+who+'交工資') })
運行結(jié)果如下:
從運行結(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);
運行結(jié)果如下:
如何移除一個事件呢?
錯誤的寫法:寫在事件觸發(fā)emit之前
life.removeListener('求安慰',function(){ console.log('給'+who+'放水') })
運行結(jié)果如下:
說明沒有起作用。
那我們應(yīng)該怎么寫呢?匿名函數(shù)這種形式是不行的,需要寫具名的函數(shù)。
改造如下:
function water(who){ console.log('給'+who+'放水') } //addEventListener life.on('求安慰',water) //移除 life.removeListener('求安慰',water)
運行結(jié)果如下:
移除事件成功。
查詢剩余的事件監(jiān)聽數(shù)?
console.log(life.listeners('求安慰').length) console.log(EventEmitter.listenerCount(life,'求安慰'))
結(jié)果如下:
移除全部的監(jiān)聽:包括求關(guān)愛、求安慰的
life.removeAllListeners()
運行結(jié)果如下:
如果只想移除求安慰的,這個時候就需要傳遞具體的事件的名字的,
例如:
life.removeAllListeners('求安慰')
運行結(jié)果如下:
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。