خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

نحوه استفاده از Event Emitters در Node.js

رویدادهای سفارشی خود را ایجاد و مدیریت کنید تا کد جاوا اسکریپت پشتیبان خود را به طور موثر سازماندهی کنید.

Event Emitters اشیایی در NodeJS هستند که با ارسال پیامی برای علامت دادن به وقوع یک عمل، رویدادها را راه‌اندازی می‌کنند.

Node.js یک ماژول رویداد داخلی را ارائه می دهد. این شامل یک کلاس ارسال کننده رویداد است که به شما امکان می دهد رویدادهای سفارشی را از طریق توابع پاسخ به تماس ایجاد و مدیریت کنید.

در اینجا نحوه انتشار رویدادها، گوش دادن و مدیریت داده های رویداد و مدیریت خطاهای رویداد در NodeJS را خواهید آموخت.

انتشار رویدادها

ماژول رویدادها بخش اصلی محیط سمت سرور Node.js است. بنابراین، شما نیازی به نصب آن ندارید، اما قبل از استفاده از کلاس EventEmitter، باید از ماژول رویدادها وارد کرده و آن را نمونه سازی کنید.

اینطوری:

const EventEmitter = require("events");
 
// Instantiatating the EventEmitter
const myEmitter = new EventEmitter();

شما می توانید رویدادها را با استفاده از روش Emit EventEmitter منتشر کنید. متد emit یک رویدادName و تعداد دلخواه آرگومان را به عنوان پارامتر می گیرد.

هنگامی که متد emit را فراخوانی می کنید، رویدادName را منتشر می کند. سپس به طور همزمان هر یک از شنوندگان رویداد را به ترتیبی که آنها را ثبت کرده‌اید فرا می‌خواند و آرگومان‌های ارائه‌شده را به هر کدام ارسال می‌کند. در نهایت اگر رویداد شنونده داشته باشد true و اگر شنونده نداشته باشد false را برمی گرداند.

مثلا:

myEmitter.emit("TestEvent", "foo", "bar", 1, 2);

در بلوک کد بالا، TestEvent را به عنوان EventName، و “foo”، “bar”، 1 و 2 را به عنوان آرگومان ارسال کردید. هنگامی که بلوک کد بالا اجرا می شود، به تمام شنوندگانی که برای رویداد TestEvent گوش می دهند، اطلاع می دهد. آن شنوندگان را با استدلال های داده شده فراخوانی می کند.

گوش دادن به رویدادها

می توانید با استفاده از روش EventEmitter’s on به رویدادهای منتشر شده گوش دهید. متد on یک EventName و یک تابع callback را به عنوان پارامتر می گیرد. هنگامی که رویداد با EventName ارسال شده به متد on منتشر می شود، تابع callback خود را فراخوانی می کند. این روش یک مرجع به EventEmitter برمی‌گرداند و به شما امکان می‌دهد چندین تماس را زنجیره‌ای کنید.

مطلب مرتبط:   6 راه برای تشخیص یک API خوب

مثلا:

// First Listener
myEmitter.on("TestEvent", () => {
  console.log("TestEvent Emitted!!!");
}); // TestEvent Emitted!!!
 
// Second Listener
myEmitter.on("TestEvent", (...args) => {
  args = args.join(", ");
  console.log(`Event emitted with the following arguments: ${args}`);
}); // Event emitted with the following arguments: foo, bar, 1, 2
 
myEmitter.emit("TestEvent", "foo", "bar", 1, 2);

در بلوک کد بالا، هنگامی که رویداد TestEvent منتشر می شود، شنوندگان رویداد، توابع پاسخ به تماس خود را فراخوانی می کنند. شنوندگان به ترتیبی که آنها را ثبت کرده اید واکنش نشان می دهند، به این معنی که پاسخ “شنونده اول” قبل از دوم اجرا می شود و غیره.

می توانید این رفتار را با استفاده از متد prependListener EventEmitter تغییر دهید. این روش همان پارامترهای متد on را می گیرد. تفاوت این است که این روش بدون توجه به زمانی که آن را ثبت می کنید، ابتدا به رویداد واکنش نشان می دهد.

مثلا:

myEmitter.on("TestEvent", () => {
  console.log("TestEvent Emitted!!!");
});
 
myEmitter.prependListener("TestEvent", () => {
    console.log("Executes first")
})
 
// console.log(myEmitter.listeners("TestEvent"));
myEmitter.emit("TestEvent", "foo", "bar", 1, 2);

هنگامی که بلوک کد بالا اجرا می شود، ابتدا “Executes First” در کنسول ثبت می شود و سپس “TestEvent Emitted!!!” صرف نظر از ترتیبی که آنها را به دلیل روش prependListener ثبت کرده اید.

اگر چندین شنونده را با

prependListener

روش، آنها به ترتیب از آخرین به اولین اجرا خواهند شد.

به چیدمان امیتر و شنونده توجه کنید. شنوندگان همیشه قبل از امیتر می آیند. این ترتیب به این دلیل است که شنوندگان باید از قبل به رویداد گوش دهند قبل از اینکه امیتر آن را منتشر کند.

برای زمینه، بلوک کد زیر را در نظر بگیرید:

myEmitter.emit("TestEvent", "foo", "bar", 1, 2);
 
myEmitter.on("TestEvent", () => {
  console.log("TestEvent Emitted!!!");
});

اگر بلوک کد بالا را اجرا کنید، هیچ اتفاقی نمی‌افتد زیرا در زمانی که فرستنده رویداد را منتشر می‌کرد، هیچ شنونده‌ای به رویداد گوش نمی‌داد.

مطلب مرتبط:   نحوه سیم کشی و برنامه ریزی چند دکمه با آردوینو

یک بار گوش دادن به رویدادها

بسته به نیاز شما، ممکن است لازم باشد برخی از رویدادها را فقط یک بار در چرخه عمر برنامه خود مدیریت کنید. شما می توانید با استفاده از روش EventEmitter’s Once به این هدف برسید.

این متد همان آرگومان های متد on را می گیرد و به طور مشابه عمل می کند. تنها تفاوت این است که شنوندگانی که با روش Once ثبت نام کرده اند فقط یک بار برای رویداد گوش می دهند.

مثلا:

myEmitter.once("SingleEvent", () => {
  console.log("Event handled once");
});
 
myEmitter.emit("SingleEvent"); // Event handled once
myEmitter.emit("SingleEvent"); // Ignored
myEmitter.emit("SingleEvent"); // Ignored

اجرای بلوک کد فقط یک بار «رویداد یک بار رسیدگی شد» را وارد کنسول می‌کند، صرفنظر از اینکه فرستنده هر چند وقت یک بار رویداد را منتشر می‌کند.

شنوندگانی که با روش یک بار ثبت شده اند به ترتیبی که شما آنها را ثبت می کنید به رویداد واکنش نشان می دهند. می توانید این رفتار را با استفاده از متد prependOnceListener تغییر دهید که مانند prependListener عمل می کند. تنها تفاوت این است که شنوندگانی که با روش Once ثبت نام کرده اند فقط یک بار برای رویداد گوش می دهند.

رسیدگی به خطاها با فرستنده رویداد

شما باید مراقب باشید که خطاهای جاوا اسکریپت را به درستی مدیریت کنید و شنوندگان رویداد نیز از این قاعده مستثنی نیستند. خطاهای کنترل نشده آنها باعث می شود که فرآیند Node.js خارج شود و برنامه شما از کار بیفتد.

برای رسیدگی به یک رویداد خطا، حداقل یکی از شنوندگان رویداد باید نام رویداد خود را روی خطا تنظیم کند.

مثلا:

myEmitter.on("error", (error) => {
  console.error(`Error: ${error}`);
});

اگر شنونده یک خطای احتمالی را مدیریت کند، مانند بلوک کد بالا، برنامه را از خراب شدن در هنگام بروز خطا متوقف می کند.

مطلب مرتبط:   درک انتقال و انیمیشن در Svelte

مثلا:

myEmitter.emit("error", new Error("This is an error"));

اجرای بلوک کد بالا “This is a error” را در کنسول ثبت می کند زیرا شنونده در حال مدیریت رویدادهای خطا است.

مدیریت شنوندگان رویداد

کلاس EventEmitter چندین متد دارد که به شما امکان می دهد شنوندگان رویداد را دستکاری و مدیریت کنید. می توانید شنوندگان یک رویداد را دریافت کنید، آنها را حذف کنید و حداکثر تعداد شنوندگان را برای یک رویداد تنظیم کنید.

در اینجا جدولی حاوی متدهای EventEmitter است که می توانید شنوندگان رویداد را با آن دستکاری کنید:

روش

استدلال ها

ارزش بازگشتی

شنوندگان تعداد

نام رخداد

تعداد شنوندگان مشترک یک رویداد را برمی‌گرداند

شنوندگان

نام رخداد

آرایه ای از شنوندگان را برمی گرداند

removeListener

نام رخداد

حداقل یک شنونده را از یک رویدادName مشخص حذف می کند.

removeAllListeners

نام رخداد

همه شنوندگان را برای یک رویدادName مشخص حذف می کند. اگر نام رویداد را مشخص نکنید، این فراخوانی روش همه شنوندگان EventEmitter را حذف می‌کند.

setMaxListeners

عدد

حداکثر تعداد شنوندگان پیش‌فرض در هر رویداد را تغییر می‌دهد. از بی نهایت یا صفر برای نشان دادن تعداد نامحدودی از شنوندگان استفاده کنید. به طور پیش فرض، شما فقط می توانید ده شنونده را در یک رویداد مشترک کنید.

شما فقط می توانید این روش ها را بر روی یک فراخوانی کنید
Event Emitter
نمونه، مثال.

مثلا:

myEmitter.removeListener("TestEvent");

بلوک کد بالا یک شنونده را برای رویداد TestEvent حذف می کند.

اهمیت انتشار دهنده رویداد

Node.js پارادایم برنامه نویسی رویداد محور را با پشتیبانی از انتشار دهنده ها و شنوندگان رویداد اتخاذ می کند. برنامه‌نویسی رویداد محور یکی از دلایلی است که برنامه‌های Node.js سریع‌تر و ساده‌تر از برخی جایگزین‌ها هستند. شما به راحتی می توانید چندین رویداد را همگام کنید و در نتیجه کارایی بهتری خواهید داشت.