فهم process.nextTick()
عندما تحاول فهم حلقة الأحداث في Node.js، فإن جزءًا مهمًا منها هو process.nextTick()
. في كل مرة تقوم فيها حلقة الأحداث برحلة كاملة، نسميها دورة (tick).
عندما نمرر دالة إلى process.nextTick()
، فإننا نوجه المحرك إلى استدعاء هذه الدالة في نهاية العملية الحالية، قبل بدء دورة حلقة الأحداث التالية:
process.nextTick(() => {
// القيام بشيء ما
})
حلقة الأحداث مشغولة بمعالجة شفرة الدالة الحالية. عندما تنتهي هذه العملية، يقوم محرك JS بتشغيل جميع الدوال الممررة إلى مكالمات nextTick
أثناء تلك العملية.
هذه هي الطريقة التي يمكننا من خلالها إخبار محرك JS بمعالجة دالة بشكل غير متزامن (بعد الدالة الحالية)، ولكن في أقرب وقت ممكن، وليس وضعها في قائمة الانتظار.
ستقوم مكالمة setTimeout(() => {}, 0)
بتنفيذ الدالة في نهاية الدورة التالية، بعد وقت طويل من استخدام nextTick()
الذي يعطي الأولوية للمكالمة وينفذها قبل بداية الدورة التالية مباشرةً.
استخدم nextTick()
عندما تريد التأكد من أن الكود قد تم تنفيذه بالفعل في تكرار حلقة الأحداث التالي.
مثال على ترتيب الأحداث:
console.log('Hello => number 1')
setImmediate(() => {
console.log('Running before the timeout => number 3')
})
setTimeout(() => {
console.log('The timeout running last => number 4')
}, 0)
process.nextTick(() => {
console.log('Running at next tick => number 2')
})
مثال على الإخراج:
Hello => number 1
Running at next tick => number 2
Running before the timeout => number 3
The timeout running last => number 4
قد يختلف الإخراج الدقيق من تشغيل إلى آخر.