EventEmitter অবজেক্ট
EventEmitter হল একটি মডিউল যা Node.js-এ বস্তুর মধ্যে যোগাযোগের সুবিধা দেয়। এটি নোডের অ্যাসিঙ্ক্রোনাস ইভেন্ট-চালিত আর্কিটেকচারের কেন্দ্রবিন্দুতে।
নোডের অনেক বিল্ট-ইন মডিউল ইভেন্ট ইমিটার থেকে প্রাপ্ত, যার মধ্যে HTTP সার্ভার, স্ট্রীম এবং আরও অনেক কিছু রয়েছে।
ইভেন্ট ইমিটার আমদানি করা হচ্ছে
// পদ্ধতি 1: প্রয়োজন ব্যবহার করে const EventEmitter = প্রয়োজন ('ইভেন্ট'); // পদ্ধতি 2: ES6 ধ্বংস const { EventEmitter } = প্রয়োজন ('ইভেন্ট');
একটি ইভেন্ট ইমিটার তৈরি করা
const EventEmitter = প্রয়োজন ('ইভেন্ট'); // একটি নতুন EventEmitter ইভেন্ট তৈরি করুন const myEmitter = new EventEmitter(); // এমন একটি ক্লাস তৈরি করুন যা EventEmitter প্রসারিত করে ক্লাস MyEmitter প্রসারিত করে EventEmitter { কনস্ট্রাক্টর() { সুপার(); } } // বর্ধিত ক্লাস তৈরি করুন const myExtendedEmitter = new MyEmitter();
ইভেন্ট ইমিটার পদ্ধতি
| পদ্ধতি | ব্যাখ্যা |
|---|---|
| addListener(event, listener) | নির্দিষ্ট ইভেন্টের জন্য শ্রোতা সারির শেষে একজন শ্রোতা যোগ করে। অন() এর বিকল্প নাম। |
| 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) | নির্দিষ্ট ইভেন্টের জন্য শ্রোতাদের অ্যারের একটি অনুলিপি প্রদান করে, যেকোনও বন্ধ (যেমন একবার() দ্বারা তৈরি করা) সহ। |
ইভেন্ট ইমিটার বৈশিষ্ট্য
| বৈশিষ্ট্য | ব্যাখ্যা |
|---|---|
| EventEmitter.defaultMaxListeners | উপলব্ধতা সমস্ত EventEmitter ইভেন্টের জন্য শ্রোতার সর্বোচ্চ সংখ্যা সেট করে। ব্যালেন্স 10। |
| emitter.errorMonitor | একটি স্থির প্রতীক যা শুধুমাত্র 'ত্রুটি' ইভেন্টগুলি নিরীক্ষণ করতে একজন শ্রোতাকে প্রতিষ্ঠা করতে ব্যবহার করা যেতে পারে। |
| emitter.captureRejections | সত্য হলে, প্রতিশ্রুতি প্রত্যাখ্যান ধরা পড়ে এবং 'ত্রুটি' ঘটনা হিসাবে নির্গত হয়। |
একটি মৌলিক ইভেন্ট ইমিটার অ্যাপ্লিকেশন
const EventEmitter = প্রয়োজন ('ইভেন্ট'); const myEmitter = new EventEmitter(); // ইভেন্ট শ্রোতাদের নিবন্ধন করুন myEmitter.on('ইভেন্ট', () => { console.log('একটি ঘটনা ঘটেছে!'); }); // ঘটনা নির্গত myEmitter.emit('ইভেন্ট');
শ্রোতাদের যুক্তি পাস
const EventEmitter = প্রয়োজন ('ইভেন্ট'); const myEmitter = new EventEmitter(); // একাধিক আর্গুমেন্ট সহ ইভেন্ট myEmitter.on('স্থিতি', (কোড, বার্তা) => { console.log(`স্থিতি পেয়েছি: ${code} ${message}`); }); // যুক্তি সহ প্রকাশ করুন myEmitter.emit('স্থিতি', 200, 'ঠিক আছে');
এক সময়ের অনুষ্ঠান শ্রোতা
const EventEmitter = প্রয়োজন ('ইভেন্ট'); const myEmitter = new EventEmitter(); // শ্রোতাদের একবার যোগ করুন myEmitter.one('onetime', () => { console.log('এটি শুধুমাত্র একবার বলা হবে'); }); // প্রথম আউটপুট - শ্রোতাকে ট্রিগার করে myEmitter.emit('এক সময়'); // দ্বিতীয় আউটপুট - শ্রোতাকে ট্রিগার করে না myEmitter.emit('এক সময়');
ত্রুটি ঘটনা
const EventEmitter = প্রয়োজন ('ইভেন্ট'); const myEmitter = new EventEmitter(); // ইভেন্ট পরিচালনার ত্রুটি myEmitter.on('error', (err) => { console.error('একটি ত্রুটি ঘটেছে:', err.message); }); // একটি ত্রুটি ইভেন্ট নির্গত myEmitter.emit('ত্রুটি', নতুন ত্রুটি ('কিছু ভুল হয়েছে')); // যদি কোনো 'ত্রুটি' শ্রোতা যোগ করা না হয়, নোড ক্র্যাশ হবে // সর্বদা ত্রুটি হ্যান্ডলিং যোগ করুন!
ইভেন্টের নাম এবং শ্রোতা পাচ্ছেন
const EventEmitter = প্রয়োজন ('ইভেন্ট'); 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('ইভেন্ট2 এর জন্য শ্রোতার সংখ্যা:', myEmitter.listenerCount('event2'));
শ্রোতাদের মুছে ফেলা হচ্ছে
const EventEmitter = প্রয়োজন ('ইভেন্ট'); const myEmitter = new EventEmitter(); // শ্রোতা ফাংশন সংজ্ঞায়িত করুন (মোছার জন্য প্রয়োজনীয়) ফাংশন লিসেনার1() { console.log('Listener 1 enabled'); } ফাংশন লিসেনার2() { console.log('শ্রোতা 2 সক্রিয়'); } // শ্রোতা যোগ করুন myEmitter.on('ইভেন্ট', শ্রোতা 1); myEmitter.on('ইভেন্ট', শ্রোতা 2); console.log('মোছার আগে শ্রোতারা:', myEmitter.listenerCount('event')); // নির্দিষ্ট শ্রোতা মুছুন myEmitter.removeListener('ইভেন্ট', listener1); // অথবা একটি উপনাম ব্যবহার করে: myEmitter.off('event', listener1); console.log('মোছার পরে শ্রোতারা:', myEmitter.listenerCount('event')); // একটি ইভেন্টের জন্য সমস্ত শ্রোতাদের মুছুন myEmitter.removeAllListeners('ইভেন্ট'); console.log('সব মুছে ফেলার পরে শ্রোতারা:', myEmitter.listenerCount('event'));
সর্বোচ্চ শ্রোতা নির্ধারণ করা
const EventEmitter = প্রয়োজন ('ইভেন্ট'); // সমস্ত EventEmitter ইভেন্টের জন্য উপলব্ধ শ্রোতাদের সর্বোচ্চ সংখ্যা সেট করুন EventEmitter.defaultMaxListeners = 15; const myEmitter = new EventEmitter(); // নির্দিষ্ট ইভেন্টের জন্য শ্রোতার সর্বোচ্চ সংখ্যা সেট করুন myEmitter.setMaxListeners(20); console.log('উপলব্ধ সর্বোচ্চ শ্রোতা:', EventEmitter.defaultMaxListeners); console.log('myEmitter Max Listeners:', myEmitter.getMaxListeners()); // maxListeners এর থেকে বেশি যোগ করা একটি সতর্কতা ট্রিগার করবে // সতর্কতা সম্ভাব্য মেমরি লিক সনাক্ত করতে সাহায্য করে
শ্রোতাদের সারি
const EventEmitter = প্রয়োজন ('ইভেন্ট'); const myEmitter = new EventEmitter(); // রিজার্ভ আচরণ: শ্রোতাদের যোগ করা ক্রমে মৃত্যুদন্ড কার্যকর করা হয় myEmitter.on('event', () => console.log('প্রথম শ্রোতা')); myEmitter.on('event', () => console.log('দ্বিতীয় শ্রোতা')); // পূর্বরূপ শ্রোতা যোগ করুন (যা প্রথমে চলবে) myEmitter.prependListener('event', () => console.log('prependListener')); // এককালীন পূর্বরূপ শ্রোতা myEmitter.prependOnceListener('event', () => console.log('PrependOnce Listener')); // ঘটনা নির্গত myEmitter.emit('ইভেন্ট'); // আউটপুট হবে: // এককালীন শ্রোতাদের পূর্বরূপ দেখুন // প্রিভিউ শ্রোতা // প্রথম শ্রোতা // দ্বিতীয় শ্রোতা
ইভেন্ট ইমিটার প্রসারিত করা হচ্ছে
Node.js EventEmitter , :
const EventEmitter = প্রয়োজন ('ইভেন্ট'); // প্রাইভেট ক্লাস যা ইভেন্ট ইমিটারকে প্রসারিত করে ক্লাস MyApp EventEmitter প্রসারিত করে { কনস্ট্রাক্টর() { সুপার(); this.name = 'MyApp'; } প্রক্রিয়া(ডেটা) { // কিছু প্রক্রিয়াকরণ করুন console.log(`প্রসেসিং ডেটা: ${data}`); // প্রক্রিয়াকরণ ফলাফলের উপর ভিত্তি করে ইভেন্ট নির্গত করুন যদি (data.length > 10) { this.emit('লার্জ-ডেটা', ডেটা); } অন্য { this.emit('small-data', data); } // ফলাফল ইভেন্ট নির্গত this.emit('প্রসেসড', ডেটা); } } // একটি ইভেন্ট তৈরি করুন const অ্যাপ = নতুন MyApp(); // ইভেন্ট শ্রোতাদের নিবন্ধন করুন app.on('লার্জ-ডেটা', (ডেটা) => { console.log(`বড় ডেটা পাওয়া গেছে: ${data.length} বাইট`); }); app.on('small-data', (data) => { console.log(`ছোট তথ্য পাওয়া গেছে: ${data.length} বাইট`); }); app.on('প্রসেসড', (ডেটা) => { console.log('প্রসেসিং সম্পন্ন'); }); // অ্যাপটি ব্যবহার করুন app.process('হ্যালো'); app.process('হ্যালো, এটি ডেটার একটি দীর্ঘ স্ট্রিং');
অ্যাসিঙ্ক্রোনাস বনাম সিঙ্ক্রোনাইজেশন
EventEmitter সমস্ত শ্রোতাকে সিঙ্ক্রোনাসভাবে কল করে যাতে তারা নিবন্ধিত হয়। প্রত্যাশিত অপারেটিং ক্রম বজায় রাখা গুরুত্বপূর্ণ:
const EventEmitter = প্রয়োজন ('ইভেন্ট'); const myEmitter = new EventEmitter(); // শ্রোতাদের নিবন্ধন করুন myEmitter.on('ইভেন্ট', () => { console.log('শ্রোতা সক্রিয়'); }); // ঘটনা নির্গত console.log('রিলিজের আগে'); myEmitter.emit('ইভেন্ট'); console.log('আফটার রিলিজ'); // আউটপুট: // আউটপুট আগে // শ্রোতা সক্ষম // আউটপুট পরে
শ্রোতাদের অ্যাসিঙ্ক্রোনাসভাবে চালানোর জন্য, আপনি setImmediate() বা process.nextTick(): ব্যবহার করতে পারেন:
const EventEmitter = প্রয়োজন ('ইভেন্ট'); const myEmitter = new EventEmitter(); // setImmediate ব্যবহার করে অ্যাসিঙ্ক্রোনাস শ্রোতাদের নিবন্ধন করুন myEmitter.on('async-ইভেন্ট', () => { setImmediate(() => { console.log('অ্যাসিনক্রোনাস লিসেনার সক্রিয়'); }); }); console.log('রিলিজের আগে'); myEmitter.emit('async-ইভেন্ট'); console.log('আফটার রিলিজ'); // আউটপুট: // আউটপুট আগে // আউটপুট পরে // অ্যাসিঙ্ক্রোনাস শ্রোতা সক্ষম
প্রতিশ্রুতি একীকরণ
আধুনিক Node.js সংস্করণে EventEmitter প্রতিশ্রুতি পরিচালনা করতে পারে এবং প্রত্যাখ্যান করতে পারে:
const EventEmitter = প্রয়োজন ('ইভেন্ট'); // ক্যাচিং রিজেক্টেশন সক্ষম করুন (Node.js 12.16.0+) const myEmitter = new EventEmitter({ captureRejections: true }); // অথবা বিশ্বব্যাপী সেট করুন // EventEmitter.captureRejections = সত্য; // ইভেন্ট হ্যান্ডলার যে প্রতিশ্রুতি ফেরত দেয় myEmitter.on('async-operation', async () => { // এই প্রত্যাখ্যাত প্রতিশ্রুতি ধরা পড়ে এবং একটি 'ত্রুটি' ইভেন্টে রূপান্তরিত হয় নতুন ত্রুটি নিক্ষেপ ('অ্যাসিনক্রোনাস অপারেশন ব্যর্থ'); }); // ত্রুটি হ্যান্ডলিং myEmitter.on('error', (err) => { console.error('ত্রুটি ধরা পড়েছে:', err.message); }); // ঘটনা আগুন myEmitter.emit('async-operation');
বাস্তব বিশ্বের উদাহরণ: HTTP সার্ভার
EventEmitter বিভিন্ন Node.js কোর মডিউল চালায়। এখানে একটি HTTP সার্ভার ইভেন্ট ব্যবহার করে কিভাবে:
const http = প্রয়োজন('http'); // HTTP সার্ভার একটি ইভেন্ট ইমিটার const সার্ভার = http.createServer(); // 'অনুরোধ' ইভেন্টের জন্য শুনুন server.on('request', (request, response) => { console.log(${request.url}`-এর জন্য ${request.method} অনুরোধ প্রাপ্ত হয়েছে); response.writeHead(200, { 'Content-Type': 'text/plain' }); response.end('হ্যালো ওয়ার্ল্ড\n'); }); // 'সংযোগ' ইভেন্টের জন্য শুনুন server.on('সংযোগ', (সকেট) => { console.log('নতুন ক্লায়েন্ট সংযোগ', socket.remoteAddress); }); // 'ক্লোজ' ইভেন্টের জন্য শুনুন server.on('close', () => { console.log('সার্ভার বন্ধ'); }); // পোর্ট 8080 এ শুনুন server.listen(8080, () => { console.log('পোর্ট 8080 এ সার্ভার শুনছে'); }); // তারপর, সার্ভার বন্ধ করুন // server.close();
সাধারণ পদ্ধতি এবং সর্বোত্তম অনুশীলন
1. সর্বদা 'ত্রুটি' ইভেন্টের জন্য শুনুন
যদি একটি EventEmitter একটি 'ত্রুটি' ইভেন্ট নির্গত করে এবং সেখানে কোনো শ্রোতা না থাকে, তাহলে Node.js একটি ত্রুটি ছুড়ে দেবে এবং প্রক্রিয়াটি ক্র্যাশ করবে। সর্বদা ত্রুটি পরিচালনা অন্তর্ভুক্ত করুন:
const EventEmitter = প্রয়োজন ('ইভেন্ট'); const myEmitter = new EventEmitter(); // সর্বদা ত্রুটি পরিচালনা অন্তর্ভুক্ত করুন myEmitter.on('error', (err) => { console.error('একটি ত্রুটি ঘটেছে:', ত্রুটি); // ত্রুটিটি যথাযথভাবে পরিচালনা করুন });
2. মেমরি ফাঁস প্রতিরোধ করতে শ্রোতাদের পরিষ্কার করুন
const EventEmitter = প্রয়োজন ('ইভেন্ট'); const myEmitter = new EventEmitter(); ফাংশন সেটআপহ্যান্ডলার() { const handler = () => console.log('event handled'); // হ্যান্ডলার যোগ করুন myEmitter.on('কিছু-ইভেন্ট', হ্যান্ডলার); // একটি পরিষ্কার ফাংশন প্রদান রিটার্ন ফাংশন ক্লিনআপ() { myEmitter.removeListener('some-event', handler); }; } // একটি হ্যান্ডলার সেট আপ করুন const cleanup = setupHandler(); // পরে, যখন প্রয়োজন হবে না পরিষ্কার ();
3> অপসারণযোগ্য শ্রোতাদের জন্য নামযুক্ত ফাংশন ব্যবহার করুন
// খারাপ - এই শ্রোতাদের পরে মুছে ফেলা যাবে না emitter.on('ইভেন্ট', () => console.log('অনামী ফাংশন')); // ভাল - রেফারেন্স দ্বারা সরানো যেতে পারে ফাংশন নামের হ্যান্ডলার() { console.log('ফাংশনের নাম'); } emitter.on('ইভেন্ট', নাম হ্যান্ডলার); // পরে emitter.removeListener('ইভেন্ট', নামের হ্যান্ডলার);