نگاهی به ماژول Events و 10 متد پرکاربرد EventEmitter

نگاهی به ماژول Events و 10 متد پرکاربرد EventEmitter

سلام ، خداقوت توسعه دهنده های عزیز 🤩 امیدوارم حالتون خوب باشه و سرشار از انرژی باشید . راستش این نقطه ی شروع سفر من تو ویرگول هست و خوشحالم که بالاخره عزم خودم رو جزم کردم تا شروع به نوشتن کنم و از این طریق بتونم بعضی از مطالب رو با شما عزیزان به اشتراک بزارم . تو این مطلب میخوایم با رویدادها در Nodejs آشنا بشیم و ببینیم که اصلا رویدادها چی هستن و چطور میتونیم رویدادهای موردنظرمون رو ایجاد و مدیریت کنیم ? همونطور که میدونید هر عمل و هر اتفاقی که تو کامپیوتر رخ میده یک Event محسوب میشه ، مثلا برای درک بهتر میتونیم برقرار شدن یک connection و یا رویدادهای مرتبط با فایل ها رو در نظر بگیریم ، اینکه وقتی فایلی باز میشه ، در داخلش چیزی نوشته میشه و نهایتا اون فایل بسته میشه ، همه و همه جزء رویدادها محسوب میشن . ماژول درونی events در Node.js به ما این اجازه رو میده که رویدادهای دلخواه خودمون رو ایجاد کنیم و هر بار که خواستیم اون هارو اجرا کنیم . این ماژول حاوی کلاسی بنام EventEmitter هست و از طریق این کلاسه که میتونیم رویداد ها رو ایجاد و مدیریت کنیم 🙂 ! به زبان ساده ، این کلاس به ما اجازه میده که به یک رویدادی گوش کنیم و یک عملیاتی رو به اون رویداد اختصاص بدیم تا هر زمانی که اون رویداد رخ داد ، عملیات موردنظرمون اجرا بشن ! برای درک بهتر این موضوع باید دست به کد بشیم پس ادیتور خودتونو آماده کنید و قدم به قدم با متن پیش بیاید 🙂 برای شروع کدنویسی رویدادها ، باید در وهله ی اول کلاس EventEmitter از ماژول events رو ایمپورت کنیم و بعد ازش یک آبجکت بسازیم :این آبجکت ( شئ ee ) دو تا متد اصلی داره که ما برای رویدادها از اونا استفاده میکنیم : یکی on و یکی هم emit که اول به سراغ متد on میریم . این متد دو تا پارامتر ورودی دریافت میکنه و اولین پارامترش اسم رویدادی هست که قراره بعدا فراخونیش کنیم ( که در اینجا اسمش “FirstEvent” هست ) و دومین پارامترش هم تابعی هست که بعد از رخ دادن رویداد موردنظرمون ، قرار هست بطور خودکار صدا زده بشه ! این تموم اون چیزی هست که ما برای راه اندازی یک رویداد بهش نیاز داریم !در خط آخر قطعه کد بالا هم اسم رویداد موردنظرمون رو به متد emit دادیم تا رویدادمون رو فراخونی کنه ( این متد همه ی Listener ‌های یک رویداد رو به ترتیبی که ثبت شدن فراخوانی میکنه . ) حالا اگر برنامه مون رو اجرا کنیم ، میبینیم که متن زیر تو کنسول چاپ شده :First subscriber باور کنید یا نه کد بالا مهم ترین پایه و اساس استفاده از EventEmitter هست ! ما همچنین میتونیم موقعی که رویدادی رخ میده ، اطلاعات اضافی ای رو هم از طریق متد emit به رویداد موردنظرمون انتقال بدیم و برای اینکه بتونیم از این اطلاعات توی تابع کنترل کننده رویداد استفاده کنیم ، باید اونها رو به صورت پارامتر دریافت کنیم :خروجی :First subscriber : This is my first Node.js event emitter example.توجه کنیم که توی کد بالا فقط یه پارامتر دیتا وجود داره ، در حالی که ما میتونیم تعداد بیشتری از اطلاعات رو به رویداد موردنظرمون انتقال بدیم ، یعنی در این زمینه محدودیتی وجود نداره ! خوب حالا که با مقدمات رویدادها آشنا شدیم ، بیایم یه سری هم به متدهای پرکاربرد و مفید کلاس EventEmitter بزنیم .این متد نام مستعاری برای متد on هست ، یعنی تو قطعه کد بالا میتونیم بجای متد ( )ee.on از متد ( )ee.addListener استفاده کنیم .نکته ی مهمی که در رابطه با عملکرد EventEmitter باید بهش توجه کنیم این هست که ما میتونیم برای هر رویدادی ، بیش از یک Listener داشته باشیم! یعنی میتونیم Listener های مختلف رو با استفاده از متد ( )on به یک رویداد اختصاص بدیم تا وقتی از طریق متد ( )emit رویداد موردنظرمون رو فراخونی کردیم ، تمامی Listener ها به ترتیب اجرا بشن . بطور پیشفرض Node به ما اجازه میده که برای هر رویداد حداکثر از ده Listener استفاده کنیم و در صورتی که تعداد Listener ها بیشتر از 10 تا باشه ، Node بهمون پیام هشدار میده ! مثلا اگر این کد رو اجرا کنیم ، پیام هشداری رو خواهیم دید :برای اینکه بتونیم حداکثر تعداد مجاز Listener ها رو افزایش یا کاهش بدیم ، باید از متد setMaxListeners( ) استفاده کنیم . مثلا اگر بخوایم که حداکثر تعداد مجاز Listener ها رو از 10 تا به 20 تا افزایش بدیم ، کافیه این خط رو به بالای تمام Listener ها اضافه کنیم :حالا اگر برنامه مون رو اجرا کنیم ، دیگه هشداری رو نمیبینیم !این متد نام یک رویداد یا نام یک eventEmiter رو به عنوان پارامتر ورودی دریافت میکنه و حداکثر تعداد listener های ممکن برای اون رویداد یا اون eventEmiter رو برامون برمیگردونه .از طریق این متد میتونیم تعداد Listener ‌های مرتبط با یک رویداد رو بدست بیاریم . مثال : خروجی :number of events : 4این متد آرایه ‌ای از رشته ‌ها رو برامون برمیگردونه که هر رشته معرف نام رویداد مرتبط با EventEmitter جاری هست . مثال :خروجی :[ ‘Event 1’ , ‘Event 2’ , ‘Event 3’ , ‘Event 4’ ]این متد دقیقاً مشابه متد ( )on هست اما با این تفاوت که رویداد موردنظرمون رو فقط یکبار میتونیم از طریق متد ( )emit فراخونی کنیم ، چون بعد از اینکه رویدادمون برای اولین بار فراخوانی بشه ، Listener ش بطور خودکار حذف میشه و دیگه وجود نخواهد داشت ! برای درک بهتر این موضوع ، قطعه کد زیرو در نظر بگیریم :اگر این برنامه رو اجرا کنیم خواهیم دید که پیغام You’ll never see this again فقط یکبار چاپ میشه ! البته بجای این روش ، به صورت دستی هم میتونیم تابع Listener رو حذف کنیم که در ادامه با این روش هم آشنا میشیم .از طریق این متد میتونیم قابلیت های متد once رو بصورت دستی شبیه سازی کنیم . این متد دو تا پارامتر بع عنوان ورودی دریافت میکنه که پارامتر اولش اسم رویداد و پارامتر دومش هم تابع Listener هست . تا الان ما از توابع بی نام به عنوان Listener استفاده میکردیم ، اما اگر بخوایم که بعداً بصورت دستی قادر به حذف یک Listener باشیم ، باید Listener مون اسم داشته باشه تا بتونیم بهش ارجاع بدیم :حالا اگر کد بالا رو اجرا کنیم ، خواهیم دید که این متد هم عملکردی مشابه متد once داره .این متد نام مستعاری برای متد ( )removeListener هست ، یعنی تو قطعه کد بالا میتونیم بجای متد ( )ee.removeListener ، از متد ( )ee.of استفاده کنیم.اگر بخوایم تمام Listener هایی که به یک رویداد مرتبط هستن رو حذف کنیم ، میتونیم از متد ( )removeAllListeners استفاده کنیم و فقط کافیه که اسم رویداد مورد نظرمون رو بهش بدیم :و برای اینکه کل Listener های تمام رویدادها رو حذف کنیم ، کافیه که متد ( )removeAllListeners رو بدون هیچ پارامتری فراخوانی کنیم .این متد اسم یک رویداد رو به عنوان پارامتر ورودی دریافت میکنه و آرایه ای از Listener های مرتبط با اون رویداد رو برامون برمیگردونه . مثال :[ [ Function : onlyOnce ] ]
[ ]حالا که با متدهای پرکاربرد کلاس EventEmitter آشنا شدیم ، بیایم با روش های متدوال استفاده از اون هم آشنا بشیم .برای استفاده از EventEmitter ها در Node.js دو تا روش متداول وجود داره :در این روش ، فانکشن سازنده آبجکتی از کلاسEventEmitter رو برامون برمیگردونه که برای مدیریت رویدادها ازش استفاده میشه ، در واقع میتونیم از این آبجکت و متدon( ) برای ایجاد اشتراک در رویداد ها استفاده کنیم ، یعنی هنگامی که رویدادی رخ داد یا اصطلاحا رویدادی emit شد ، فانکشنی اجرا بشه ! مثال :خروجی :About to start the process for 1
Processing number : 1
Completed processing 1About to start the process for 2
Processing number : 2
Completed processing 2About to start the process for 3
Processing number : 3
Completed processing 3در این روش باید سازنده ی کلاس EventEmitter رو در داخل یک فانکشن توسعه بدیم و رویدادهارو در داخل اون مدیریت کنیم. بطور مثال ما در برنامه ی زیر فانکشن LoopProcessor رو از طریق متد util.inherits( )با کلاس EventEmitter گسترش دادیم و this هم به کلاس EventEmitterاشاره داره :خروجی :About to start the process for 1
Processing number : 1
Completed processing 1About to start the process for 2
Processing number : 2
Completed processing 2About to start the process for 3
Processing number : 3
Completed processing 3خوب دوستان به پایان این مقاله رسیدیم و امیدوارم لذت کافی رو برده باشین . قطعا این مطلب خالی از عیب و نقص نیست و ازتون میخوام اگر جایی اشتباهی چیزی دیدین حتما بهم بگین تا باهم رفعش کنیم ، خلاصه پذیرای نظرات و انتقادهای گرمتون هستم 😍 راستی اگر دوست داشتین حتما منو دنبال کنید چراکه ایده های باحال و جذابی توی سر و رو کاغذ دارم و سعی میکنم مطالب کاربردی و مفیدتری رو در آینده منتشر کنم . مخلصیم 💛 | سیاوش ستاری – 27 آذر 1399

Author: admin

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *