حلقة الأحداث
جزء من قسم أساسيات 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 يعني التنفيذ بأسرع ما يمكن بعد انتهاء المهام الدقيقة، وليس قبلها أبدًا. تُطلَق المؤقّتات حسب ترتيب مدة تأخيرها؛ وعند تساوي مدد التأخير، يُطلَق المؤقّت الذي تم ضبطه أولًا أولًا.
التحدي
سهلينفّذ Node شيفرتك بترتيب ثابت. أولًا الأسطر العادية، ثم المهام الدقيقة مثل استدعاءات ردّ الوعد، ثم المؤقتات. استخدم هذا الترتيب لجعل الأسطر الأربعة تُطبع بترتيب الأرقام من دون نقلها.
يطبع order.js أسطره الأربعة من 4 إلى 1. لا تنقل الأسطر ولا تغيّر ترتيبها. بدلًا من ذلك، أَحِط ثلاثة منها بحيث تُنفَّذ لاحقًا.
- اترك
console.log('1 sync')كما هو. تُنفَّذ الشيفرة العادية أولًا. - أَحِط سطر
2 microtaskبـqueueMicrotask، ليُنفَّذ مباشرةً بعد الشيفرة العادية. - أَحِط سطر
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');
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس أساسيات Node.js
1تشغيل JavaScript على Node
مرحبًا يا Nodeقراءة الأمروسائط سطر الأوامرالأوامر4البرمجة غير المتزامنة في Node
استخدام نتيجة دالة الاستدعاءدوال الاستدعاءنتيجة Promiseعندما يفشل Promiseالوعودانتظار قيمةAsync وAwaitقراءتان مستقلتانPromise.allحلقة الأحداثالمؤقتاتتدرّب بنفسك: Playground لـ Express