Rumah >hujung hadapan web >tutorial js >Mari bercakap secara mendalam tentang EventEmitter dalam node.js
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.
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触发事件
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);
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') // 不生效了
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,'报错了') })
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('报错了'))
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事件
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'); //在这里的时候才是真正被删除掉了
addListener dan pada Sama seperti
eventNames
mengembalikan tatasusunan yang mengandungi nama semua acara berdaftarconst {EventEmitter} =require('events'); const MyEvent=new EventEmitter(); MyEvent.on('data',()=>{}); MyEvent.on('finish',()=>{}); console.log(MyEvent.eventNames()); //打印结果 ['data','finish']
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('events'); const MyEvent=new EventEmitter(); console.log(MyEvent.getMaxListener()); //10 event.setMaxListener(20); console.log(MyEvent.getMaxListener(20));
listenerCount
Kembalikan bilangan acara berdaftarconst {EventEmitter} =require('events'); const MyEvent=new EventEmitter(); MyEvent.on('data',()=>{}); MyEvent.on('data',()=>{}); MyEvent.on('finish',()={}); console.log(MyEvent.listenerCount()) // 2Lagi 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!