حلقة الأحداث في Node.js تبدو غامضة حتى تتوقف عن التفكير فيها كقائمة واحدة.
هناك قوائم متعددة وأولويات متعددة متضمنة، وأدق جزء للكثير من المهندسين هو أن المهام الصغيرة ليست هي نفس حلقة المراحل الرئيسية لـ libuv.
نموذج عقلي مفيد
هذا البرنامج النصي يمثل نقطة انطلاق جيدة:
setTimeout(() => console.log("timeout"), 0);
setImmediate(() => console.log("immediate"));
Promise.resolve().then(() => console.log("promise"));
process.nextTick(() => console.log("nextTick"));
console.log("sync");
المفاهيم المهمة هي:
- الكود المتزامن يعمل أولاً
process.nextTick يعمل قبل المهام الصغيرة الأخرى في Node
- ردود نداء الوعود تعمل قبل أن تواصل حلقة الأحداث إلى مراحل لاحقة
- الموقتات و
setImmediate تنتمي إلى مراحل لاحقة مختلفة
لهذا السبب يعد process.nextTick قوياً جداً وسهلاً جداً في إساءة الاستخدام.
لماذا يمكن أن يؤذيك nextTick
إذا قمت بجدولة المزيد من الأعمال باستخدام nextTick بشكل متكرر، يمكنك تجويع الإدخال/الإخراج لأن Node يستمر في تصريف تلك القائمة قبل الانتقال.
لهذا السبب يجب استخدام nextTick باعتدال.
إذا كنت تحتاج إلى تقديم الوقت حتى تتمكن حلقة الأحداث من الاستمرار في خدمة العملية، فإن setImmediate غالباً ما يكون الأداة الأكثر صحة.
القيمة الهندسية
هذا ليس مجرد معلومات للاستجواب.
إنه مهم عندما تكون:
- تشخص مشاكل الذروة في الاستجابة
- تقوم بتصحيح ترتيب ردود الأفعال الغريبة
- تحاول تجنب تجويع الإدخال/الإخراج
تتوقف حلقة الأحداث عن الشعور بالسحر مرة واحدة عندما تفكر في القوائم ونقاط الجدولة بدلاً من "الكود غير المتزامن يحدث لاحقًا."
مزيد من القراءة