يعمل JavaScript على خيط واحد فقط، لذا يمكنه القيام بشيء واحد فقط في كل مرة. حلقة الأحداث هي ما تسمح له بالتعامل مع العمل غير المتزامن دون حجب: فهي تشغل call stack، وعندما تكون stack فارغة، تسحب callbacks من الطوابير.
هناك طابورين بأولويات مختلفة:
يعمل JavaScript على خيط واحد فقط، لذا يمكنه القيام بشيء واحد فقط في كل مرة. حلقة الأحداث هي ما تسمح له بالتعامل مع العمل غير المتزامن دون حجب: فهي تشغل call stack، وعندما تكون stack فارغة، تسحب callbacks من الطوابير.
هناك طابورين بأولويات مختلفة:
.then)، queueMicrotask. يتم استنزافها بالكامل بعد كل مهمة، قبل التصيير.setTimeout، I/O، أحداث واجهة المستخدم. يتم معالجة واحد لكل تكرار حلقة.console.log("1"); // sync
setTimeout(() => console.log("2"), 0); // macrotask
Promise.resolve().then(() => console.log("3")); // microtask
console.log("4"); // sync
// Output: 1, 4, 3, 2
1، 4.3.2.هذا هو السبب في أن Promise.then يعمل دائماً قبل setTimeout(…, 0)، على الرغم من أن كليهما "غير متزامن" — فإن microtasks لها أولوية.
// ❌ blocks the single thread — UI freezes for 5 seconds
while (Date.now() - start < 5000) {}
العمل المتزامن الطويل يحجب كل شيء (التصيير، النقرات). قم بنقل عمل CPU الثقيل إلى Web Worker (خيط منفصل حقيقي).
فهم الحلقة يشرح ترتيب async، لماذا يتم حل الوعود قبل المؤقتات، ولماذا يجب عدم حجب الخيط الرئيسي — النموذج الذهني الأساسي لجميع JavaScript غير المتزامن.