EventEmitter பொருள்
EventEmitter என்பது Node.js இல் பொருள்களுக்கு இடையேயான தகவல்தொடர்பை எளிதாக்கும் ஒரு தொகுதியாகும். இது Node இன் அசிங்க்ரோனஸ் நிகழ்வு-ஆதாரமான கட்டமைப்பின் மையத்தில் உள்ளது.
Node இன் உள்ளமைக்கப்பட்ட பல தொகுதிகள் EventEmitter இலிருந்து பரம்பரை பெறுகின்றன, HTTP சேவையகங்கள், ஸ்ட்ரீம்கள் மற்றும் பலவும் அடங்கும்.
EventEmitter ஐ இறக்குமதி செய்தல்
// முறை 1: require பயன்படுத்துதல்
const EventEmitter = require('events');
// முறை 2: ES6 destructuring
const { EventEmitter } = require('events');
EventEmitter உருவாக்குதல்
const EventEmitter = require('events');
// புதிய EventEmitter நிகழ்வை உருவாக்கவும்
const myEmitter = new EventEmitter();
// EventEmitter ஐ விரிவுபடுத்தும் வகுப்பை உருவாக்கவும்
class MyEmitter extends EventEmitter {
constructor() {
super();
}
}
// விரிவுபடுத்தப்பட்ட வகுப்பை உருவாக்கவும்
const myExtendedEmitter = new MyEmitter();
EventEmitter முறைகள்
| முறை | விளக்கம் |
|---|---|
| addListener(event, listener) | குறிப்பிட்ட நிகழ்வுக்கான கேட்போர் வரிசையின் முடிவில் ஒரு கேட்போரைச் சேர்க்கிறது. on()க்கான மாற்றுப் பெயர். |
| emit(event, [arg1], [arg2], ...) | நிகழ்விற்குப் பதிவுசெய்யப்பட்ட ஒவ்வொரு கேட்போரையும் அவை பதிவுசெய்யப்பட்ட வரிசையில் ஒத்திசைவாக அழைக்கிறது, வழங்கப்பட்ட வாதங்களை ஒவ்வொருவருக்கும் அனுப்புகிறது. |
| eventNames() | எமிட்டருக்குப் பதிவுசெய்யப்பட்ட கேட்போர்கள் உள்ள நிகழ்வுகளை பட்டியலிடும் ஒரு வரிசையை வழங்குகிறது. |
| getMaxListeners() | emitter.setMaxListeners(n) மூலம் அமைக்கப்பட்ட அல்லது EventEmitter.defaultMaxListeners இல் இருப்பு மதிப்பாக உள்ள EventEmitter க்கான தற்போதைய அதிகபட்ச கேட்போர் மதிப்பை வழங்குகிறது. |
| listenerCount(event) | குறிப்பிட்ட நிகழ்வைக் கேட்கும் கேட்போர்களின் எண்ணிக்கையை வழங்குகிறது. |
| listeners(event) | குறிப்பிட்ட நிகழ்வுக்கான கேட்போர்களின் வரிசையின் நகலை வழங்குகிறது. |
| off(event, listener) | removeListener()க்கான மாற்றுப் பெயர். |
| on(event, listener) | குறிப்பிட்ட நிகழ்வுக்கான கேட்போர் வரிசையின் முடிவில் ஒரு கேட்போரைச் சேர்க்கிறது. |
| once(event, listener) | ஒரு முறை மட்டும் தூண்டப்பட்ட பிறகு நீக்கப்படும் நிகழ்வுக்கான ஒரு முறை கேட்போரைச் சேர்க்கிறது. |
| prependListener(event, listener) | குறிப்பிட்ட நிகழ்வுக்கான கேட்போர் வரிசையின் தொடக்கத்தில் ஒரு கேட்போரைச் சேர்க்கிறது. |
| prependOnceListener(event, listener) | ஒரு முறை மட்டும் தூண்டப்பட்ட பிறகு நீக்கப்படும் நிகழ்வுக்கான கேட்போர் வரிசையின் தொடக்கத்தில் ஒரு முறை கேட்போரைச் சேர்க்கிறது. |
| removeAllListeners([event]) | அனைத்து கேட்போர்களையும் அல்லது குறிப்பிட்ட நிகழ்வின் கேட்போர்களையும் நீக்குகிறது. |
| removeListener(event, listener) | குறிப்பிட்ட நிகழ்வுக்கான கேட்போர் வரிசையிலிருந்து குறிப்பிட்ட கேட்போரை நீக்குகிறது. |
| setMaxListeners(n) | ஒரு EventEmitter நிகழ்வில் சேர்க்கக்கூடிய அதிகபட்ச கேட்போர்களின் எண்ணிக்கையை அமைக்கிறது. |
| rawListeners(event) | குறிப்பிட்ட நிகழ்வுக்கான கேட்போர்களின் வரிசையின் நகலை வழங்குகிறது, எந்தவொரு மூடல்களையும் (once() மூலம் உருவாக்கப்பட்டவை போன்றவை) உள்ளடக்கியது. |
EventEmitter பண்புகள்
| பண்பு | விளக்கம் |
|---|---|
| EventEmitter.defaultMaxListeners | அனைத்து EventEmitter நிகழ்வுகளுக்கும் இருப்பு அதிகபட்ச கேட்போர்களின் எண்ணிக்கையை அமைக்கிறது. இருப்பு 10. |
| emitter.errorMonitor | 'error' நிகழ்வுகளைக் கண்காணிக்க மட்டும் ஒரு கேட்போரை நிறுவ பயன்படுத்தக்கூடிய ஒரு நிலையான சின்னம். |
| emitter.captureRejections | உண்மையாக இருக்கும்போது, வாக்குறுதி நிராகரிப்புகள் பிடிக்கப்பட்டு 'error' நிகழ்வுகளாக வெளியிடப்படுகின்றன. |
அடிப்படை EventEmitter பயன்பாடு
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
// நிகழ்வு கேட்போரைப் பதிவு செய்யவும்
myEmitter.on('event', () => {
console.log('ஒரு நிகழ்வு நடந்தது!');
});
// நிகழ்வை வெளியிடவும்
myEmitter.emit('event');
கேட்போர்களுக்கு வாதங்களை அனுப்புதல்
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
// பல வாதங்களுடன் நிகழ்வு
myEmitter.on('status', (code, message) => {
console.log(`நிலை கிடைத்தது: ${code} ${message}`);
});
// வாதங்களுடன் வெளியிடவும்
myEmitter.emit('status', 200, 'OK');
ஒரு முறை நிகழ்வு கேட்போர்கள்
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
// ஒரு முறை கேட்போரைச் சேர்க்கவும்
myEmitter.once('onetime', () => {
console.log('இது ஒரு முறை மட்டுமே அழைக்கப்படும்');
});
// முதல் வெளியீடு - கேட்போரைத் தூண்டும்
myEmitter.emit('onetime');
// இரண்டாவது வெளியீடு - கேட்போரைத் தூண்டாது
myEmitter.emit('onetime');
பிழை நிகழ்வுகள்
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
// பிழை நிகழ்வு கையாளுதல்
myEmitter.on('error', (err) => {
console.error('பிழை ஏற்பட்டது:', err.message);
});
// பிழை நிகழ்வை வெளியிடவும்
myEmitter.emit('error', new Error('ஏதோ தவறு நடந்தது'));
// 'error' கேட்போர் சேர்க்கப்படவில்லை என்றால், Node வீசி கிராஷ் ஆகும்
// எப்போதும் பிழை கையாளுதலைச் சேர்க்கவும்!
நிகழ்வு பெயர்கள் மற்றும் கேட்போர்களைப் பெறுதல்
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
// சில கேட்போர்களைச் சேர்க்கவும்
myEmitter.on('event1', () => console.log('நிகழ்வு 1'));
myEmitter.on('event2', () => console.log('நிகழ்வு 2'));
myEmitter.on('event2', () => console.log('நிகழ்வு 2 மீண்டும்'));
// அனைத்து நிகழ்வு பெயர்களையும் பெறவும்
console.log('நிகழ்வு பெயர்கள்:', myEmitter.eventNames());
// குறிப்பிட்ட நிகழ்வுக்கான கேட்போர்களைப் பெறவும்
console.log('event2 க்கான கேட்போர்கள்:', myEmitter.listeners('event2'));
// கேட்போர்களை எண்ணுங்கள்
console.log('event2 க்கான கேட்போர் எண்ணிக்கை:', myEmitter.listenerCount('event2'));
கேட்போர்களை நீக்குதல்
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
// கேட்போர் செயல்பாட்டை வரையறுக்கவும் (நீக்கத்திற்குத் தேவை)
function listener1() {
console.log('கேட்போர் 1 இயக்கப்பட்டது');
}
function listener2() {
console.log('கேட்போர் 2 இயக்கப்பட்டது');
}
// கேட்போர்களைச் சேர்க்கவும்
myEmitter.on('event', listener1);
myEmitter.on('event', listener2);
console.log('நீக்குவதற்கு முன் கேட்போர்கள்:', myEmitter.listenerCount('event'));
// குறிப்பிட்ட கேட்போரை நீக்கவும்
myEmitter.removeListener('event', listener1);
// அல்லது மாற்றுப் பெயரைப் பயன்படுத்துதல்: myEmitter.off('event', listener1);
console.log('நீக்கிய பின் கேட்போர்கள்:', myEmitter.listenerCount('event'));
// ஒரு நிகழ்வுக்கான அனைத்து கேட்போர்களையும் நீக்கவும்
myEmitter.removeAllListeners('event');
console.log('அனைத்தையும் நீக்கிய பின் கேட்போர்கள்:', myEmitter.listenerCount('event'));
அதிகபட்ச கேட்போர்களை அமைத்தல்
const EventEmitter = require('events');
// அனைத்து EventEmitter நிகழ்வுகளுக்கும் இருப்பு அதிகபட்ச கேட்போர்களை அமைக்கவும்
EventEmitter.defaultMaxListeners = 15;
const myEmitter = new EventEmitter();
// குறிப்பிட்ட நிகழ்வுக்கான அதிகபட்ச கேட்போர்களை அமைக்கவும்
myEmitter.setMaxListeners(20);
console.log('இருப்பு அதிகபட்ச கேட்போர்கள்:', EventEmitter.defaultMaxListeners);
console.log('myEmitter அதிகபட்ச கேட்போர்கள்:', myEmitter.getMaxListeners());
// maxListeners ஐ விட அதிகமாகச் சேர்ப்பது எச்சரிக்கையைத் தூண்டும்
// எச்சரிக்கை சாத்தியமான நினைவக கசிவுகளை அடையாளம் காண உதவுகிறது
கேட்போர்களின் வரிசை
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
// இருப்பு நடத்தை: கேட்போர்கள் சேர்க்கப்பட்ட வரிசையில் இயக்கப்படும்
myEmitter.on('event', () => console.log('முதல் கேட்போர்'));
myEmitter.on('event', () => console.log('இரண்டாவது கேட்போர்'));
// முன்னோட்ட கேட்போரைச் சேர்க்கவும் (அது முதலில் இயக்கப்படும்)
myEmitter.prependListener('event', () => console.log('முன்னோட்ட கேட்போர்'));
// ஒரு முறை முன்னோட்ட கேட்போர்
myEmitter.prependOnceListener('event', () => console.log('முன்னோட்ட ஒரு முறை கேட்போர்'));
// நிகழ்வை வெளியிடவும்
myEmitter.emit('event');
// வெளியீடு இருக்கும்:
// முன்னோட்ட ஒரு முறை கேட்போர்
// முன்னோட்ட கேட்போர்
// முதல் கேட்போர்
// இரண்டாவது கேட்போர்
EventEmitter ஐ விரிவுபடுத்துதல்
Node.js இல் ஒரு பொதுவான முறை EventEmitter ஐ விரிவுபடுத்தும் ஒரு வகுப்பை உருவாக்குவதாகும், தனிப்பட்ட செயல்பாட்டைச் சேர்ப்பது:
const EventEmitter = require('events');
// EventEmitter ஐ விரிவுபடுத்தும் தனிப்பட்ட வகுப்பு
class MyApp extends EventEmitter {
constructor() {
super();
this.name = 'MyApp';
}
process(data) {
// சில செயலாக்கங்களைச் செய்யுங்கள்
console.log(`தரவைச் செயலாக்குகிறது: ${data}`);
// செயலாக்க முடிவுகளின் அடிப்படையில் நிகழ்வுகளை வெளியிடவும்
if (data.length > 10) {
this.emit('large-data', data);
} else {
this.emit('small-data', data);
}
// முடிவு நிகழ்வை வெளியிடவும்
this.emit('processed', data);
}
}
// ஒரு நிகழ்வை உருவாக்கவும்
const app = new MyApp();
// நிகழ்வு கேட்போர்களைப் பதிவு செய்யவும்
app.on('large-data', (data) => {
console.log(`பெரிய தரவு கண்டறியப்பட்டது: ${data.length} பைட்டுகள்`);
});
app.on('small-data', (data) => {
console.log(`சிறிய தரவு கண்டறியப்பட்டது: ${data.length} பைட்டுகள்`);
});
app.on('processed', (data) => {
console.log('செயலாக்கம் முடிந்தது');
});
// பயன்பாட்டைப் பயன்படுத்தவும்
app.process('Hello');
app.process('Hello, this is a longer string of data');
அசிங்க்ரோனஸ் vs. ஒத்திசைவு
EventEmitter அனைத்து கேட்போர்களையும் அவை பதிவுசெய்யப்பட்ட வரிசையில் ஒத்திசைவாக அழைக்கிறது. எதிர்பார்க்கப்படும் இயக்க வரிசையை பராமரிப்பதற்கு முக்கியமானது:
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
// கேட்போரைப் பதிவு செய்யவும்
myEmitter.on('event', () => {
console.log('கேட்போர் இயக்கப்பட்டது');
});
// நிகழ்வை வெளியிடவும்
console.log('வெளியீட்டிற்கு முன்');
myEmitter.emit('event');
console.log('வெளியீட்டிற்குப் பிறகு');
// வெளியீடு:
// வெளியீட்டிற்கு முன்
// கேட்போர் இயக்கப்பட்டது
// வெளியீட்டிற்குப் பிறகு
கேட்போர்களை அசிங்க்ரோனஸாக இயக்க, நீங்கள் setImmediate() அல்லது process.nextTick() பயன்படுத்தலாம்:
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
// setImmediate பயன்படுத்தி அசிங்க்ரோனஸ் கேட்போரைப் பதிவு செய்யவும்
myEmitter.on('async-event', () => {
setImmediate(() => {
console.log('அசிங்க்ரோனஸ் கேட்போர் இயக்கப்பட்டது');
});
});
console.log('வெளியீட்டிற்கு முன்');
myEmitter.emit('async-event');
console.log('வெளியீட்டிற்குப் பிறகு');
// வெளியீடு:
// வெளியீட்டிற்கு முன்
// வெளியீட்டிற்குப் பிறகு
// அசிங்க்ரோனஸ் கேட்போர் இயக்கப்பட்டது
வாக்குறுதி ஒருங்கிணைப்பு
நவீன Node.js பதிப்புகளில் EventEmitter வாக்குறுதிகளைக் கையாளலாம் மற்றும் நிராகரிப்புகளைப் பிடிக்கலாம்:
const EventEmitter = require('events');
// நிராகரிப்புகளைப் பிடிக்க இயலுமைப்படுத்தவும் (Node.js 12.16.0+)
const myEmitter = new EventEmitter({ captureRejections: true });
// அல்லது உலகளவில் அமைக்கவும்
// EventEmitter.captureRejections = true;
// வாக்குறுதியை வழங்கும் நிகழ்வு கையாளுதல்
myEmitter.on('async-operation', async () => {
// இந்த நிராகரிக்கப்பட்ட வாக்குறுதி பிடிக்கப்பட்டு 'error' நிகழ்வாக மாற்றப்படும்
throw new Error('அசிங்க்ரோனஸ் செயல்பாடு தோல்வியடைந்தது');
});
// பிழை கையாளுதல்
myEmitter.on('error', (err) => {
console.error('பிடிக்கப்பட்ட பிழை:', err.message);
});
// நிகழ்வைத் தூண்டவும்
myEmitter.emit('async-operation');
நிஜ உலக எடுத்துக்காட்டு: HTTP சேவையகம்
EventEmitter பல Node.js மைய தொகுதிகளை இயக்குகிறது. ஒரு HTTP சேவையகம் நிகழ்வுகளை எவ்வாறு பயன்படுத்துகிறது என்பது இங்கே:
const http = require('http');
// HTTP சேவையகம் ஒரு EventEmitter ஆகும்
const server = http.createServer();
// 'request' நிகழ்வுகளைக் கேளுங்கள்
server.on('request', (request, response) => {
console.log(`பெறப்பட்டது ${request.method} கோரிக்கை ${request.url}க்கு`);
response.writeHead(200, { 'Content-Type': 'text/plain' });
response.end('Hello World\n');
});
// 'connection' நிகழ்வுகளைக் கேளுங்கள்
server.on('connection', (socket) => {
console.log('புதிய வாடிக்கையாளர் இணைப்பு', socket.remoteAddress);
});
// 'close' நிகழ்வைக் கேளுங்கள்
server.on('close', () => {
console.log('சேவையகம் மூடப்பட்டது');
});
// போர்ட் 8080 இல் கேளுங்கள்
server.listen(8080, () => {
console.log('சேவையகம் போர்ட் 8080 இல் கேட்கிறது');
});
// பின்னர், சேவையகத்தை மூடலாம்
// server.close();
பொதுவான முறைகள் மற்றும் சிறந்த நடைமுறைகள்
1. எப்போதும் 'error' நிகழ்வுகளைக் கேளுங்கள்
ஒரு EventEmitter 'error' நிகழ்வை வெளியிட்டு கேட்போர்கள் இல்லை என்றால், Node.js பிழையை வீசி செயல்முறையை கிராஷ் செய்யும். எப்போதும் பிழை கையாளுதலைச் சேர்க்கவும்:
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
// எப்போதும் பிழை கையாளுதலைச் சேர்க்கவும்
myEmitter.on('error', (err) => {
console.error('பிழை ஏற்பட்டது:', err);
// பிழையை பொருத்தமாக கையாளவும்
});
2. நினைவக கசிவுகளைத் தடுக்க கேட்போர்களை சுத்தம் செய்யுங்கள்
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
function setupHandler() {
const handler = () => console.log('நிகழ்வு கையாளப்பட்டது');
// கையாளுதலைச் சேர்க்கவும்
myEmitter.on('some-event', handler);
// ஒரு சுத்தம் செயல்பாட்டை வழங்கவும்
return function cleanup() {
myEmitter.removeListener('some-event', handler);
};
}
// ஒரு கையாளுதலை அமைக்கவும்
const cleanup = setupHandler();
// பின்னர், தேவையில்லாதபோது
cleanup();
3> நீக்கக்கூடிய கேட்போர்களுக்குப் பெயரிடப்பட்ட செயல்பாடுகளைப் பயன்படுத்தவும்
// மோசமானது - இந்த கேட்போரை பின்னர் நீக்க முடியாது
emitter.on('event', () => console.log('அநாமதேய செயல்பாடு'));
// நல்லது - குறிப்பு மூலம் நீக்கப்படலாம்
function namedHandler() {
console.log('பெயரிடப்பட்ட செயல்பாடு');
}
emitter.on('event', namedHandler);
// பின்னர்
emitter.removeListener('event', namedHandler);