Menu
CoddyTech

حلقة الأحداث

جزء من قسم أساسيات Node.js في رحلة Node.js على Coddy. الدرس 26 من 33.

تعمل دوال الاستدعاء اللاحق والوعود لاحقًا، وتكمن الأخطاء في عدم معرفة التوقيت الدقيق لذلك.

ينفّذ Node أولًا كل الشيفرة المتزامنة حتى نهايتها. ثم ينفّذ المهام الدقيقة: دوال الاستدعاء اللاحق للوعود والدوال المُمرَّرة إلى queueMicrotask. بعد ذلك فقط تأتي المؤقّتات. ينفّذ setTimeout(fn, ms) الدالة fn مرة واحدة، بعد ms ملّي ثانية. حتى setTimeout(fn, 0) ينتظر إلى أن تنتهي المهام الدقيقة.

setTimeout(() => console.log('C timer'), 0);
Promise.resolve().then(() => console.log('B promise'));
console.log('A sync');
// A sync, B promise, C timer

التأخير البالغ 0 يعني التنفيذ بأسرع ما يمكن بعد انتهاء المهام الدقيقة، وليس قبلها أبدًا. تُطلَق المؤقّتات حسب ترتيب مدة تأخيرها؛ وعند تساوي مدد التأخير، يُطلَق المؤقّت الذي تم ضبطه أولًا أولًا.

challenge icon

التحدي

سهل

ينفّذ Node شيفرتك بترتيب ثابت. أولًا الأسطر العادية، ثم المهام الدقيقة مثل استدعاءات ردّ الوعد، ثم المؤقتات. استخدم هذا الترتيب لجعل الأسطر الأربعة تُطبع بترتيب الأرقام من دون نقلها.

يطبع order.js أسطره الأربعة من 4 إلى 1. لا تنقل الأسطر ولا تغيّر ترتيبها. بدلًا من ذلك، أَحِط ثلاثة منها بحيث تُنفَّذ لاحقًا.

  1. اترك console.log('1 sync') كما هو. تُنفَّذ الشيفرة العادية أولًا.
  2. أَحِط سطر 2 microtask بـ queueMicrotask، ليُنفَّذ مباشرةً بعد الشيفرة العادية.
  3. أَحِط سطر 3 timeout وسطر 4 timeout later كلًّا منهما باستدعاء مستقل لـ setTimeout. ينفّذ setTimeout(fn, ms) الدالة fn مرة واحدة بعد ms مللي ثانية. يُضبط السطر 4 قبل السطر 3، لذا يحتاج إلى تأخير أطول.

بعد ذلك، تطبع node order.js ما يلي:

1 sync
2 microtask
3 timeout
4 timeout later

جرّب ذلك: خمّن الترتيب قبل تشغيله. ثم اضغط على «العب»؛ ستعرض الطرفية $ node order.js. بعد ذلك، اجعل تأخير المؤقتين 0 وشغّلهما مجددًا: ستُطبع 4 timeout later الآن قبل 3 timeout، لأن المؤقت الذي يُضبط أولًا يُنفَّذ أولًا عندما تكون التأخيرات متساوية. أعد التأخير الأطول إلى السطر 4 قبل الضغط على «تحقق».

جرّب بنفسك

// اجعل هذه الأسطر تُطبع بالترتيب الرقمي دون نقلها.
// بدلًا من ذلك، ضعها داخل queueMicrotask وsetTimeout.
console.log('4 timeout later');
console.log('3 timeout');
console.log('2 microtask');
console.log('1 sync');
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس أساسيات Node.js

تدرّب بنفسك: Playground لـ Express