almessadi.
العودة إلى الفهرس

جداول زمنية لـ Node.js تكون أكثر منطقية بمجرد فصل المهام الصغيرة عن المراحل_

ترتيب بين `process.nextTick`، والوعود، والموقتات، و `setImmediate` يكون أسهل للفهم عند معرفة مكان كل قائمة.

تاريخ النشر16 يوليو 2024
وقت القراءة7 min read

حلقة الأحداث في 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 غالباً ما يكون الأداة الأكثر صحة.

القيمة الهندسية

هذا ليس مجرد معلومات للاستجواب.

إنه مهم عندما تكون:

  • تشخص مشاكل الذروة في الاستجابة
  • تقوم بتصحيح ترتيب ردود الأفعال الغريبة
  • تحاول تجنب تجويع الإدخال/الإخراج

تتوقف حلقة الأحداث عن الشعور بالسحر مرة واحدة عندما تفكر في القوائم ونقاط الجدولة بدلاً من "الكود غير المتزامن يحدث لاحقًا."

مزيد من القراءة