تعد بنية Node القوية المستندة إلى الأحداث واحدة من أقوى مزاياها.
الماخذ الرئيسية
- تعد البرمجة المبنية على الأحداث خيارًا جيدًا للتطبيقات التفاعلية، وخاصة تطبيقات واجهة المستخدم الرسومية، لأنها تسمح للتعليمات البرمجية بالاستجابة لإجراءات المستخدم بأي ترتيب.
- تُستخدم البرمجة المبنية على الأحداث بشكل شائع في تطبيقات الويب، حيث يتم تشغيل مستمعي الأحداث عندما يتفاعل المستخدمون مع DOM.
- يعد تنفيذ البرمجة المبنية على الأحداث في Node.js أمرًا سهلاً باستخدام فئة EventEmitter، والتي تتيح لك إنشاء أحداث مخصصة وإرفاق مستمعي الأحداث للتعامل معها.
عند إنشاء أي تطبيق برمجي، يتضمن أحد القرارات الحاسمة اختيار النموذج المناسب للتعليمات البرمجية الخاصة بك.
تعد البرمجة المبنية على الأحداث خيارًا جيدًا للتطبيقات التفاعلية التي تستجيب لإجراءات المستخدم التي قد تحدث بأي ترتيب. إنه نموذج أكثر شيوعًا مع تطبيقات واجهة المستخدم الرسومية مقارنةً ببرامج سطر الأوامر أو رموز الأنظمة المضمنة.
ما هي الأحداث؟
يمكنك التفكير في الحدث باعتباره إجراءً أو حدثًا يمكن للتعليمات البرمجية الخاصة بك التعرف عليه والاستجابة له. يمكن للنظام أو المستخدم تشغيل حدث ما وعادةً ما يقوم الكود الخاص بك بتسجيل وظيفة للتعامل معه.
مثال على الحدث الأساسي هو النقر فوق زر لتنفيذ إجراء معين. يؤدي النقر فوق الزر إلى إطلاق حدث، وتسمى الوظيفة التي يتم تشغيلها عند حدوث النقر مستمع الحدث (أو المعالج).
ما هي البرمجة المبنية على الأحداث؟
البرمجة المبنية على الأحداث هي نموذج البرمجة حيث يعتمد تدفق تنفيذ التطبيق على الأحداث التي تحدث بدلاً من أن يكون متسلسلاً بشكل صارم.
يُستخدم هذا النموذج في الغالب عند إنشاء واجهات المستخدم والتطبيقات في الوقت الفعلي، حيث يجب أن يؤدي حدث مثل إجراء المستخدم إلى إطلاق إجراء في النظام.
يحظى النموذج بشعبية كبيرة عند إنشاء تطبيقات الويب، حيث يتم تشغيل مستمعي الأحداث عندما يتفاعل المستخدمون معها نموذج كائن المستند (DOM).
توضح الصورة التالية كيفية عمل التدفق في البرمجة المستندة إلى الأحداث. عند وقوع حدث ما، تستقبله قناة الحدث وتمرره إلى المستمع المناسب للتعامل معه:
البرمجة المبنية على الأحداث في Node.js
ال حلقة أحداث جافا سكريبت يعد أحد المفاهيم الأساسية وراء الطبيعة غير المتزامنة لوقت تشغيل Node.js. تستخدم البنية المبنية على الحدث ميزاتها المضمنة EventEmitter وحدة لتسهيل تدفق التنفيذ السلس.
من خلال البرمجة المبنية على الأحداث، يتيح لك Node.js إنشاء تطبيقات من جانب الخادم يمكنها التعامل مع تفاعل المستخدم وعمليات الإدخال/الإخراج ومعالجة البيانات في الوقت الفعلي. ويحدث هذا بطريقة غير معيقة، مما يؤدي إلى تحسين الأداء وتجربة أكثر سلاسة للمستخدم.
يعد تنفيذ البرمجة المستندة إلى الأحداث في Node.js أمرًا سهلاً عندما تفهم أساسيات تعريف الأحداث وتشغيلها والتعامل معها.
فئة باعث الحدث
مع ال EventEmitter في Node.js، يمكنك إنشاء أحداث مخصصة وإرفاق مستمعي الأحداث للتعامل معها. لاستخدام الفئة في التعليمات البرمجية الخاصة بك، قم باستيرادها من ملف الأحداث وحدة مثل هذا:
// CommonJS
const { EventEmitter } = require("events")
// ES6
import { EventEmitter } from"events"
يصبح الفصل ووظائف أعضائه متاحة لك لاستخدامها في تطبيقك. لبدء إرسال الأحداث ومعالجتها، قم بتهيئة مثيل جديد لـ EventEmitter فصل.
على سبيل المثال:
const FoodEvents = new EventEmitter()
يؤدي هذا إلى إنشاء كائن باعث جديد يسمى أحداث الطعام التي يمكن أن تنبعث منها الأحداث وتسجيل المستمعين. توفر فئة EventEmmitter ثلاث طرق للاستماع إلى حدث ما: على, إضافة مستمع, و مرة واحدة.
ال على الطريقة هي الوظيفة الأساسية لإضافة مستمعي الأحداث، و addListener يعمل بنفس الطريقة تمامًا. كلاهما يقبل اسم الحدث ووظيفة رد الاتصال كوسائط. رد الاتصال هو وظيفة المعالج الفعلي. يمكنك استخدام على و addListener بالتبادل.
إليك كيفية التعامل مع حدث ما باستخدام على طريقة:
FoodEvents.on("cookie_ready", (data) => {
console.log("Cookie ready for packaging, data received: ", data);
})
استخدام addListener كبديل مباشر ل على:
FoodEvents.addListener("cookie_ready", (data) => {
console.log(
"Cookie will now be packaged and sent out, data received: ",
data
);
})
سيضيف كلا المثالين رد الاتصال إلى مجموعة مستمعي الأحداث لـ Cookie_ready حدث. إذا استخدمت كليهما، فسيتم تشغيل عمليات رد الاتصال بالترتيب.
ال مرة واحدة تسجل الطريقة مستمع حدث لمرة واحدة والذي يتم تشغيله في المرة التالية التي يتم فيها تشغيل الحدث. بعد ذلك، سيقوم النظام بإزالته من مجموعة المستمعين.
إليك كيفية الاستخدام مرة واحدة للتعامل مع حدث لمرة واحدة:
FoodEvents.once("cookie_sent", (data) => {
console.log("Cookie is sent out, data received: ", data);
})
في هذه الحالة، سوف يستمع الباعث فقط إلى cookie_sent الحدث مرة واحدة وقم بإزالة المعالج بعد تشغيله.
تقوم جميع الطرق الثلاث بإرجاع الباعث، حتى تتمكن من إجراء مكالمات متتالية إلى أي منها.
لا تنس أنه لكي يتمكن المستمع من التعامل مع حدث ما، يجب أن يصدر التطبيق هذا الحدث في مرحلة ما. إليك بعض نماذج التعليمات البرمجية لإصدار ملف Cookie_ready الحدث باستخدام ينبعث طريقة:
functionbakeCookie() {
console.log("Cookie is baking, almost ready...")setTimeout(() => {
FoodEvents.emit("cookie_ready", { flavor: "vanilla cookie" })
}, 3000)
}
bakeCookie()
عندما تقوم بتشغيل هذا الكود الذي يطبع إشعارًا في وحدة التحكم بأن ملف تعريف الارتباط يتم خبزه، وينتظر لمدة 3 ثوانٍ، ويصدر الرسالة Cookie_ready الحدث، سوف تحصل على نتيجة مثل الصورة أدناه:
يوضح هذا كيفية تشغيل مستمعي الحدث بالترتيب الذي قمت بتسجيلهم به.
ال EventEmitter يوفر الفصل المزيد من الأساليب، بما في ذلك:
- com.removeListener: إزالة مثيل المستمع من مجموعة مستمعي الأحداث. ال عن الطريقة متاحة أيضًا لهذا الغرض.
- prependListener: تقوم هذه الطريقة أيضًا بتسجيل المستمع، ولكن بدلاً من إضافته إلى نهاية مصفوفة المستمعين، فإنها تضيفه إلى البداية. سيتم بعد ذلك تشغيله قبل أي مستمعين آخرين قد تكون قمت بتسجيلهم بالفعل.
- prependOnceListener: يعمل هذا تمامًا مثل prependListener، لكن المستمع يعمل مرة واحدة فقط، كما في حالة مرة واحدة.
- removeAllListeners: تقوم هذه الوظيفة بإزالة جميع المستمعين المسجلين لحدث مسمى محدد، أو جميع المستمعين إذا لم تمرر أي وسيطة إليه.
- المستمعين: إرجاع مصفوفة من المستمعين لاسم الحدث الذي تمرره إليه كوسيطة.
- أسماء الأحداث: يمكنك استخدام هذه الوظيفة للحصول على جميع أسماء الأحداث التي قمت بالفعل بتسجيل المستمع لها.
- setMaxListeners: يُرسل Node.js تحذيرًا افتراضيًا عند تسجيل أكثر من 10 مستمعين لحدث ما، لمنع تسرب الذاكرة. يمكنك ضبط هذه القيمة الافتراضية باستخدام setMaxListeners. يمكنك أيضًا التحقق من هذه القيمة باستخدام getMaxListeners.
ال الأحداث توفر الحزمة وظائف شاملة للبرمجة المستندة إلى الأحداث في Node.js.
ما هي بعض أفضل ممارسات البرمجة المبنية على الأحداث؟
كل نهج برمجة له مقايضاته، وتجاهل أفضل الممارسات يمكن أن يكون له آثار سلبية على تطبيقك. فيما يلي بعض أفضل الممارسات التي يجب مراعاتها عند إنشاء تطبيقات تعتمد على الأحداث:
- استخدم أسماء موجزة ووصفية للأحداث لتمكين قاعدة تعليمات برمجية نظيفة وقابلة للصيانة.
- اعتماد ممارسات جيدة في التعامل مع الأخطاء وتسجيلها، للسماح بتصحيح الأخطاء بسهولة.
- تجنب جحيم رد الاتصال (تداخل عمليات رد الاتصال المتعددة) عند كتابة مستمعي الأحداث. استخدم وعود JavaScript بدلاً من ذلك.
- لا تقم بإنشاء عدد كبير جدًا من المستمعين لحدث واحد. فكر في تقسيم الأحداث وتسلسلها بدلاً من ذلك.
أنشئ التطبيقات باستخدام البنية الصحيحة
القاعدة العامة التي تنطبق على بناء البرمجيات هي اتخاذ قرارات التصميم والهندسة المعمارية المناسبة. عندما تتبع النهج الخاطئ لبناء تطبيق ما، فسوف تواجه العواقب في النهاية.
البرمجة المبنية على الأحداث هي نموذج يمكن أن يكون له تأثير كبير على بنية التطبيق وأدائه. عندما يعتمد تطبيقك، أو جزء منه، على الأحداث ليعمل، فيجب عليك التفكير في البرمجة المبنية على الأحداث.