久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      深入聊聊node.js中的EventEmitter

      本篇文章帶大家了解一下node中的EventEmitter,簡(jiǎn)單聊聊一下異步操作、error事件、EventEmitter類,希望對(duì)大家有所幫助!

      深入聊聊node.js中的EventEmitter

      events(事件觸發(fā)器)


      events是nodejs內(nèi)置的事件觸發(fā)器,在node的內(nèi)置模塊里很多都用到了events,比如http.server在每次接受到請(qǐng)求時(shí)觸發(fā)事件,還有stream就是基于事件的使用on來(lái)監(jiān)聽(tīng)對(duì)應(yīng)的事件。 所有觸發(fā)事件的對(duì)象都是EventEmitter實(shí)例,這些對(duì)象暴露了EventEmitter.on('事件',callback),通常使用EventTmitte.on注冊(cè)事件,EventEmitter.emit觸發(fā)事件。

      例子:

        const events= require('events'); const event=new events();//實(shí)例化EventEmitter event.on('data',(a,b)=>{     console.log('參數(shù)'+a+b)     console.log(this,'this')     //注意,如果callback是 箭頭函數(shù)的話this指向的是全局對(duì)象     //      如果callback是function(){}形式的話,this會(huì)綁定到EventEmitter實(shí)例上     console.log('emit觸發(fā)了data事件') }) event.emit('data',1,2); //使用emit觸發(fā)事件

      異步操作

      因?yàn)镋ventEmitter.on('事件名稱',callback)里的callback是同步執(zhí)行的,但是在某些情況下我們不得不使用異步操作所以我們可以在使用SetImmediate來(lái)執(zhí)行異步操作

       const events= require('events'); const event=new events(); event.on('event', (a, b) => {        setImmediate(() => {     console.log('this happens asynchronously');   });   //因?yàn)檫@里的監(jiān)聽(tīng)器是同步執(zhí)行的,但是我們可以使用setImediate函數(shù)等待監(jiān)聽(tīng)器里的其他內(nèi)容執(zhí)行完再執(zhí)行 }); event.emit('event',1,2);

      觸發(fā)一次

      我們正常通過(guò)emit觸發(fā)事件時(shí),emit有幾個(gè)事件就會(huì)被觸發(fā)幾次,但是我們可以使用once注冊(cè)事件,使用once觸發(fā)的事件只能被觸發(fā)一次

        const EventEmitter =require('events');   const MyEventEmitter=new EventEmitter();   let a=0;   //正常注冊(cè)事件和觸發(fā)   MyEventEmitter.on('add',()=>{       a++       console.log(a)    })   MyEventEmitter.emit('add'); // 1;   MyEventEmitter.emit('add'); // 2;   // 使用once注冊(cè)   MyEventEmitter.once('add',()=>{       a++       console.log(a);   })   MyEventEmitter.emit('add') // 1   MyEventEmitter.emit('add') // 不生效了

      error事件

      EventEmitter是沒(méi)有error事件的,所以當(dāng)發(fā)生錯(cuò)誤的時(shí)候只能強(qiáng)制退出執(zhí)行,所以我們必須自己注冊(cè)一個(gè)error事件,以致于在發(fā)生錯(cuò)誤的時(shí)候觸發(fā)到error事件

       const EventEmitter=require('events');  const MyEventEmitter=new EventEmitter();  MyEvenEmitter.on('error',(err)=>{    console.error(err,'報(bào)錯(cuò)了')  })

      除了上面那種方式我們還可以通過(guò)errorMonitor在不注冊(cè)error事件的情況下,來(lái)監(jiān)聽(tīng)emit觸發(fā)的報(bào)錯(cuò) 使用了errorMonitor我們就不必要再去通過(guò)手動(dòng)注冊(cè)error事件了

        const {EventEmitter,errorMonitor}=require('events');   const MyEventEmitter=new EventEmitter();   MyEventEmitter.on(errorMonitor,(err)=>{       console.log(err);   })   MyEventEmitter('error' , new Error('報(bào)錯(cuò)了'))

      EventEmitter類

      newListener事件

      在我們添加事件監(jiān)聽(tīng)的時(shí)候會(huì)觸發(fā)newListener事件,所以我們可以注冊(cè)newListener事件用來(lái)在添加事件監(jiān)聽(tīng)的時(shí)候做一些事情

       const {EventEmitter}=require('events');   const MyEvent=new EventEmitter();   MyEvent.on('newListener',(name,litener)=>{       //name就是正在監(jiān)聽(tīng)的事件的名稱       //listener是事件的處理函數(shù)       MyEvent.on('event',()=>{         console.log('在newListener添加的事件')       })     })   MyEvent.on('event',()=>{       console.log('正常注冊(cè)的event事件')   })   //此時(shí)我們?cè)俨挥|發(fā)event事件的情況下,newListener事件就會(huì)執(zhí)行,因?yàn)槲覀冎灰谧?cè)事件就會(huì)觸發(fā)newListener事件   //注意:newListener事件必須要使用EventEmitter.once()注冊(cè),因?yàn)槿绻覀冊(cè)趎ewListener事件里再去添加注冊(cè)事件的話,而且外邊有多個(gè)注冊(cè)事件就會(huì)觸發(fā)多次newListener事件,就會(huì)發(fā)生堆棧溢出  MyEvent.emit('event');   //打印的結(jié)果    //    在newListener注冊(cè)的事件    //     正常注冊(cè)的event事件

      removeListener事件

      removeListener事件用于刪除已經(jīng)注冊(cè)的事件,但是,removeListener不會(huì)阻止掉正在被emit觸發(fā)的事件

       const callbackB=()=>{     console.log('B') } const callbackA=()=>{     console.log('A')     event.removeListener('data',callbackB) } event.on('data',callbackA) event.on('data',callbackB)  event.emit('data'); //在執(zhí)行callbackA的時(shí)候刪除了data,但是不會(huì)阻止掉下一個(gè)emit的觸發(fā) event.emit('data'); //在這里的時(shí)候才是真正被刪除掉了

      addListener 和on的作用一樣

      eventNames

      返回一個(gè)數(shù)組,數(shù)組里包含了所有已經(jīng)注冊(cè)的事件的名稱

       const {EventEmitter} =require('events');  const MyEvent=new EventEmitter();  MyEvent.on('data',()=>{});  MyEvent.on('finish',()=>{});  console.log(MyEvent.eventNames());    //打印結(jié)果   ['data','finish']

      getMaxListeners

      返回可以注冊(cè)的事件的最大數(shù)值,默認(rèn)是10,如果超過(guò)10個(gè)會(huì)有警告 但是我們可以通過(guò)setMaxListener(20) 去進(jìn)行修改

      const {EventEmitter} =require('events');  const MyEvent=new EventEmitter();  console.log(MyEvent.getMaxListener()); //10  event.setMaxListener(20);   console.log(MyEvent.getMaxListener(20));

      listenerCount

      返回注冊(cè)的事件的數(shù)量

       const {EventEmitter} =require('events');  const MyEvent=new EventEmitter();  MyEvent.on('data',()=>{});  MyEvent.on('data',()=>{});  MyEvent.on('finish',()={});  console.log(MyEvent.listenerCount()) // 2

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)