0Pricing
JavaScript Academy · درس

المهام الكبرى وقائمة المهام

افهموا كيفية جدولة المؤقتات وعمليات الإدخال والإخراج.

المهام الكبرى وقائمة المهام درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 4 دروس في المجموع.

ما المهمة الكبرى؟

إن المهمة الكبرى (وتُسمّى أيضًا مهمة) هي وحدة عمل مُجدوَلة للتنفيذ لاحقًا، بعد انتهاء الشيفرة المتزامنة الحالية. وتُعد دوال رد الاتصال الخاصة بـ setTimeout المثال الكلاسيكي على ذلك.

تنتظر المهام الكبرى في قائمة المهام حتى يصبح مكدس الاستدعاءات فارغًا.

تؤجل setTimeout العمل

تسجّل setTimeout دالة رد اتصال لتنفيذها لاحقًا. وحتى مع مهلة مقدارها 0، تُنفَّذ بعد انتهاء كل الشيفرة المتزامنة الحالية.

console.log('first');
setTimeout(() => console.log('third (timeout)'), 0);
console.log('second');

قائمة المهام

عندما ينقضي المؤقت، توضع دالة رد الاتصال الخاصة به في قائمة المهام. وتسحب حلقة الأحداث مهمة واحدة من هذه القائمة فقط عندما يكون مكدس الاستدعاءات فارغًا، ثم تنفّذها حتى تكتمل وتتحقق مجددًا.

console.log('sync start');
setTimeout(() => console.log('task 1'), 0);
setTimeout(() => console.log('task 2'), 0);
console.log('sync end');

تُنفَّذ المهام حسب ترتيب إدراجها

تُنفَّذ المهام ذات المهلة نفسها بالترتيب الذي جرى جدولتُها به. فقائمة المهام تعمل وفق FIFO: أول ما يدخل هو أول ما يخرج.

setTimeout(() => console.log('A'), 0);
setTimeout(() => console.log('B'), 0);
setTimeout(() => console.log('C'), 0);
console.log('sync');

المهلة حد أدنى وليست مدة دقيقة

المهلة التي تمرّرها هي الحد الأدنى للوقت قبل أن تصبح دالة رد الاتصال مؤهلة للتنفيذ. أما التنفيذ الفعلي فلا يحدث إلا بعد إفراغ المكدس وانتهاء المهام السابقة، لذلك قد يحدث لاحقًا.

setTimeout(() => console.log('100ms'), 100);
setTimeout(() => console.log('0ms'), 0);
console.log('synchronous runs first');

الترتيب حسب المهلة

تغيّر المهلات المختلفة ترتيب التنفيذ: تصبح المهلات الأقصر مؤهلة في وقت أقرب، ولذلك تُنفَّذ عادةً قبل المهلات الأطول، بغض النظر عن ترتيب الجدولة.

setTimeout(() => console.log('50'), 50);
setTimeout(() => console.log('10'), 10);
setTimeout(() => console.log('30'), 30);
console.log('start');

مهمة واحدة في كل دورة من حلقة الأحداث

تنفّذ حلقة الأحداث مهمة كبرى واحدة بالضبط في كل دورة، ثم تنفّذ أعمالًا أخرى قبل الدورة التالية. ويحافظ ذلك على استجابة النظام بين المهام.

console.log('1');
setTimeout(() => {
  console.log('2');
  setTimeout(() => console.log('4'), 0);
}, 0);
setTimeout(() => console.log('3'), 0);

تُدرج المؤقتات المتداخلة لاحقًا

ينضم المؤقت المُجدوَل داخل مهمة إلى قائمة الانتظار بعد المهام الموجودة فيها أصلًا، ولذلك يُنفَّذ في دورة لاحقة من حلقة الأحداث.

setTimeout(() => {
  console.log('outer');
  setTimeout(() => console.log('inner nested'), 0);
}, 0);
setTimeout(() => console.log('sibling'), 0);

تُعد setInterval مهام كبرى أيضًا

تجدول setInterval مهمة كبرى متكررة. وننفّذ هنا بضع تكرارات ثم نوقفها باستخدام clearInterval للحفاظ على حجم المخرجات ضمن حد معقول.

let count = 0;
const id = setInterval(() => {
  count++;
  console.log('tick ' + count);
  if (count === 3) clearInterval(id);
}, 10);
console.log('interval scheduled');

التنفيذ المتزامن له الأولوية دائمًا

بغض النظر عن صغر المهلة، تنتظر كل مهمة كبرى خلف كل الشيفرة المتزامنة في دورة التنفيذ الحالية. يجب إفراغ المكدس أولًا.

setTimeout(() => console.log('macrotask'), 0);
for (let i = 1; i <= 3; i++) console.log('sync ' + i);
console.log('done sync');

لماذا تهم المهام الكبرى؟

تتيح لك المهام الكبرى تأجيل العمل من دون حجب التنفيذ. ويؤدي تقسيم المهمة الثقيلة إلى أجزاء مؤقتة إلى إبقاء التطبيق مستجيبًا. لكن المهام الكبرى ليست ذات الأولوية الأعلى: إذ تُنفَّذ المهام الصغرى (الوعود) قبل المهمة الكبرى التالية، كما سترى بعد ذلك.

console.log('schedule');
setTimeout(() => console.log('runs after sync'), 0);
console.log('still sync');

اختبار سريع

متى تُنفَّذ دالة رد الاتصال الخاصة بـ setTimeout(cb, 0)؟

مراجعة: المهام الكبرى

لقد تعلمت كيفية جدولة العمل المؤجل:

  • تنتظر المهام الكبرى (setTimeout وsetInterval) في قائمة المهام.
  • تعمل القائمة وفق FIFO، وتنفّذ حلقة الأحداث مهمة واحدة في كل دورة.
  • المهلة حد أدنى، وتُنفَّذ الشيفرة المتزامنة دائمًا أولًا.
  • للمهام الصغرى أولوية أعلى، وستستكشفها بعد ذلك.

الأسئلة الشائعة

هل درس «المهام الكبرى وقائمة المهام» مجاني؟

نعم — نص درس «المهام الكبرى وقائمة المهام» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة JavaScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة JavaScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «المهام الكبرى وقائمة المهام»؟

افهموا كيفية جدولة المؤقتات وعمليات الإدخال والإخراج. تتمرن على JavaScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ JavaScript Academy؟

لا تُشترط خبرة سابقة. JavaScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «المهام الكبرى وقائمة المهام»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس JavaScript Academy هذا؟

نعم. كل درس في JavaScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مكدس الاستدعاءات
  2. المهام الكبرى وقائمة المهام
  3. المهام الصغرى والوعود
  4. queueMicrotask وترتيب التنفيذ
← العودة إلى JavaScript Academy