0Pricing
JavaScript Academy · درس

E3 — مجموعة أو طابور Promise (التزامن غير المتزامن)

شغّلوا العديد من المهام غير المتزامنة بحد صغير للتزامن. واحتفظوا بطابور، وابدؤوا عددًا قليلًا في كل مرة، واجمعوا النتائج

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

ماذا ولماذا؟

الهدف: تشغيل العديد من المهام غير المتزامنة من دون إغراق النظام.

  • حدّد التزامن، مثل مهمتين في الوقت نفسه
  • احتفظ بفهرس بسيط لقائمة الانتظار
  • خزّن النتائج في مصفوفة
  • اكتب شيفرة مناسبة للمبتدئين ومساعدات صغيرة
E3 — مجموعة أو طابور Promise (التزامن غير المتزامن) — رسم توضيحي 1

مساعد المهمة غير المتزامنة

يعيد مساعد صغير كائن Promise يُحلّ بعد تأخير، ويمكنه الفشل اختياريًا لأغراض الاختبار.

// Simulate async work with setTimeout
function fakeJob(name, ms, fail) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      if (fail) {
        reject(new Error("fail:" + name));
      } else {
        resolve("done:" + name);
      }
    }, ms);
  });
}

console.log("demo job:", typeof fakeJob === "function");
E3 — مجموعة أو طابور Promise (التزامن غير المتزامن) — رسم توضيحي 2

تنفيذ التجميعة

يبدأ runPool عددًا قليلًا من العاملين؛ يسحب كل عامل فهرس المهمة التالية وينتظر تنفيذها. وتحافظ النتائج على ترتيب الإدخال.

// Run tasks with a fixed concurrency limit
async function runPool(tasks, limit) {
  // tasks: array of functions () => Promise<any>
  const results = new Array(tasks.length);
  let next = 0;

  // worker runs tasks until none left
  async function worker() {
    while (true) {
      const i = next;
      if (i >= tasks.length) return;
      next = next + 1;

      try {
        const value = await tasks[i]();
        results[i] = { ok: true, value: value };
      } catch (e) {
        results[i] = { ok: false, error: String(e) };
      }
    }
  }

  // start up to limit workers
  const workers = [];
  for (let k = 0; k < limit; k = k + 1) {
    workers.push(worker());
  }

  await Promise.all(workers);
  return results;
}

console.log("pool ready:", typeof runPool === "function");
E3 — مجموعة أو طابور Promise (التزامن غير المتزامن) — رسم توضيحي 3

تشغيل التجميعة

حدّد عدد المهام قيد التنفيذ بـ 2. وتحافظ المصفوفة على الترتيب: يحتوي الفهرس i على نتيجة المهمة i.

// Prepare simple tasks
const jobs = [
  function () { return fakeJob("A", 300, false); },
  function () { return fakeJob("B", 200, false); },
  function () { return fakeJob("C", 150, true ); },
  function () { return fakeJob("D", 100, false); }
];

// Run with concurrency = 2
(async function () {
  const out = await runPool(jobs, 2);
  console.log("results:", out);
})();
E3 — مجموعة أو طابور Promise (التزامن غير المتزامن) — رسم توضيحي 4

غلاف إعادة المحاولة الاختياري

غلّف المهمة بمساعد صغير باسم withRetry. أبقِ الأعداد صغيرة والمنطق بسيطًا.

// Optional: add retry to a task wrapper (beginner-friendly)
function withRetry(task, attempts) {
  return async function () {
    let lastErr = null;
    for (let i = 0; i < attempts; i = i + 1) {
      try {
        return await task();
      } catch (e) {
        lastErr = e;
      }
    }
    throw lastErr;
  };
}

const jobsWithRetry = [
  withRetry(function () { return fakeJob("R1", 80, true); }, 2),
  withRetry(function () { return fakeJob("R2", 60, false); }, 2)
];

(async function () {
  const out = await runPool(jobsWithRetry, 1);
  console.log("retry results:", out);
})();
E3 — مجموعة أو طابور Promise (التزامن غير المتزامن) — رسم توضيحي 5

إرشادات للمبتدئين

نصائح:

  • خزّن المهام كدوال () => Promise.
  • احتفظ بـ فهرس تالي مشترك لقائمة الانتظار.
  • استخدم try/catch لكل مهمة وخزّن النتائج.
  • اختر حدًا صغيرًا (2–4) للمبتدئين.
E3 — مجموعة أو طابور Promise (التزامن غير المتزامن) — رسم توضيحي 6

اختبار أساسيات حد التزامن

تحقق سريع: لماذا نستخدم تجمعًا؟

E3 — مجموعة أو طابور Promise (التزامن غير المتزامن) — رسم توضيحي 7

مراجعة

مراجعة: يشغّل تجمع وعود صغير المهام بحد ثابت، ويحافظ على ترتيبها في مصفوفة النتائج، ويستخدم try/catch بسيطًا لكل مهمة. هذا نمط رائع للمبتدئين.

E3 — مجموعة أو طابور Promise (التزامن غير المتزامن) — رسم توضيحي 8

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

هل درس «E3 — مجموعة أو طابور Promise (التزامن غير المتزامن)» مجاني؟

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

ماذا ستتعلم في «E3 — مجموعة أو طابور Promise (التزامن غير المتزامن)»؟

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

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

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

كم من الوقت يستغرق درس «E3 — مجموعة أو طابور Promise (التزامن غير المتزامن)»؟

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

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

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

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

  1. E1 — مقيّم التعبيرات (الجزء 1: + و- من اليسار إلى اليمين)
  2. E2 — محلّل السجلات (مرشحات وعدّادات بسيطة)
  3. E3 — مجموعة أو طابور Promise (التزامن غير المتزامن)
← العودة إلى JavaScript Academy