Mari bercakap secara mendalam tentang EventEmitter dalam node.js

青灯夜游
Lepaskan: 2022-05-09 21:33:59
ke hadapan
2244 orang telah melayarinya

Artikel ini akan membawa anda melalui EventEmitter dalam nod, dan bercakap secara ringkas tentang operasi tak segerak, acara ralat dan kelas EventEmitter saya harap ia akan membantu semua orang.

Mari bercakap secara mendalam tentang EventEmitter dalam node.js

acara (pencetus peristiwa)


acara ialah pencetus peristiwa terbina dalam nodej , peristiwa digunakan dalam kebanyakan modul terbina dalam nod Contohnya, http.server mencetuskan peristiwa setiap kali ia menerima permintaan dan menggunakan aliran untuk mendengar peristiwa yang sepadan berdasarkan peristiwa. Semua objek yang mencetuskan peristiwa ialah kejadian EventEmitter.

Contoh:

  const events= require('events');
const event=new events();//实例化EventEmitter
event.on('data',(a,b)=>{
    console.log('参数'+a+b)
    console.log(this,'this')
    //注意,如果callback是 箭头函数的话this指向的是全局对象
    //      如果callback是function(){}形式的话,this会绑定到EventEmitter实例上
    console.log('emit触发了data事件')
})
event.emit('data',1,2); //使用emit触发事件
Salin selepas log masuk

Kendalian tak segerak

Kerana EventEmitter.on('nama acara', Panggilan balik dalam panggilan balik) dilaksanakan secara serentak, tetapi dalam beberapa kes kita perlu menggunakan operasi tak segerak, jadi kita boleh menggunakan SetImmediate untuk melaksanakan operasi tak segerak

 const events= require('events');
const event=new events();
event.on('event', (a, b) => {
    
  setImmediate(() => {
    console.log('this happens asynchronously');
  });
  //因为这里的监听器是同步执行的,但是我们可以使用setImediate函数等待监听器里的其他内容执行完再执行
});
event.emit('event',1,2);
Salin selepas log masuk

cetus sekali

Apabila kita biasanya mencetuskan peristiwa melalui emit, emit akan dicetuskan beberapa kali jika terdapat beberapa acara, tetapi kita boleh menggunakan sekali untuk mendaftar acara, dan peristiwa yang dicetuskan menggunakan sekali hanya boleh dicetuskan sekali

  const EventEmitter =require('events');
  const MyEventEmitter=new EventEmitter();
  let a=0;
  //正常注册事件和触发
  MyEventEmitter.on('add',()=>{
      a++
      console.log(a) 
  })
  MyEventEmitter.emit('add'); // 1;
  MyEventEmitter.emit('add'); // 2;
  // 使用once注册
  MyEventEmitter.once('add',()=>{
      a++
      console.log(a);
  })
  MyEventEmitter.emit('add') // 1
  MyEventEmitter.emit('add') // 不生效了
Salin selepas log masuk

acara ralat

EventEmitter tidak mempunyai acara ralat, jadi apabila ralat berlaku, pelaksanaan hanya boleh dipaksa untuk keluar, jadi kita mesti Daftar peristiwa ralat sendiri supaya peristiwa ralat dicetuskan apabila ralat berlaku

 const EventEmitter=require('events');
 const MyEventEmitter=new EventEmitter();
 MyEvenEmitter.on('error',(err)=>{
   console.error(err,'报错了')
 })
Salin selepas log masuk

Selain kaedah di atas, kami juga boleh menggunakan errorMonitor untuk memantau pencetus pancaran tanpa mendaftarkan ralat Menggunakan errorMonitor, kami tidak lagi perlu mendaftarkan acara ralat secara manual

  const {EventEmitter,errorMonitor}=require('events');
  const MyEventEmitter=new EventEmitter();
  MyEventEmitter.on(errorMonitor,(err)=>{
      console.log(err);
  })
  MyEventEmitter('error' , new Error('报错了'))
Salin selepas log masuk

Kelas EventEmitter

acara newListener

Acara newListener akan dicetuskan apabila kami menambah pendengar acara, jadi kami boleh mendaftarkan acara newListener untuk melakukan sesuatu apabila menambahkan pendengar acara

 const {EventEmitter}=require('events');
  const MyEvent=new EventEmitter();
  MyEvent.on('newListener',(name,litener)=>{
      //name就是正在监听的事件的名称
      //listener是事件的处理函数
      MyEvent.on('event',()=>{
        console.log('在newListener添加的事件')
      })  
  })
  MyEvent.on('event',()=>{
      console.log('正常注册的event事件')
  })
  //此时我们再不触发event事件的情况下,newListener事件就会执行,因为我们只要正在注册事件就会触发newListener事件
  //注意:newListener事件必须要使用EventEmitter.once()注册,因为如果我们在newListener事件里再去添加注册事件的话,而且外边有多个注册事件就会触发多次newListener事件,就会发生堆栈溢出
 MyEvent.emit('event');

 //打印的结果
   //    在newListener注册的事件
   //     正常注册的event事件
Salin selepas log masuk

alih keluar Acara Pendengar

acara removeListener digunakan untuk memadamkan acara berdaftar Walau bagaimanapun, removeListener tidak akan menghalang acara dicetuskan oleh emit

 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'); //在执行callbackA的时候删除了data,但是不会阻止掉下一个emit的触发
event.emit('data'); //在这里的时候才是真正被删除掉了
Salin selepas log masuk

addListener dan pada Sama seperti <🎜. >

eventNames

mengembalikan tatasusunan yang mengandungi nama semua acara berdaftar

 const {EventEmitter} =require(&#39;events&#39;);
 const MyEvent=new EventEmitter();
 MyEvent.on(&#39;data&#39;,()=>{});
 MyEvent.on(&#39;finish&#39;,()=>{});
 console.log(MyEvent.eventNames());
 
 //打印结果
  [&#39;data&#39;,&#39;finish&#39;]
Salin selepas log masuk

getMaxListeners

pulangan bilangan maksimum acara yang boleh didaftarkan adalah 10. Jika lebih daripada 10, akan ada amaran. Tetapi kita boleh mengubah suainya melalui setMaxListener(20)

const {EventEmitter} =require(&#39;events&#39;);
 const MyEvent=new EventEmitter();
 console.log(MyEvent.getMaxListener()); //10
 event.setMaxListener(20); 
 console.log(MyEvent.getMaxListener(20));
Salin selepas log masuk

listenerCount

Kembalikan bilangan acara berdaftar

 const {EventEmitter} =require(&#39;events&#39;);
 const MyEvent=new EventEmitter();
 MyEvent.on(&#39;data&#39;,()=>{});
 MyEvent.on(&#39;data&#39;,()=>{});
 MyEvent.on(&#39;finish&#39;,()={});
 console.log(MyEvent.listenerCount()) // 2
Salin selepas log masuk
Lagi Untuk nod -pengetahuan berkaitan, sila lawati:

tutorial nodejs!

Atas ialah kandungan terperinci Mari bercakap secara mendalam tentang EventEmitter dalam node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:juejin.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan