0Pricing
JavaScript Academy · درس

أنماط إعادة المحاولة والتراجع التدريجي

أعيدوا محاولة العمل غير المتزامن الفاشل عدة مرات مع فواصل زمنية؛ وأضيفوا تراجعًا أُسّيًا وjitter صغيرًا؛ وأوقفوا المحاولات بعد حد أقصى واضح

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

لماذا إعادة المحاولة؟

الهدف: إضافة محاولات إعادة محدودة ومضبوطة.

  • حلقة بسيطة لإعادة المحاولة
  • التأخير التدريجي الأسي
  • تذبذب طفيف
  • حد أقصى واضح للمحاولات
أنماط إعادة المحاولة والتراجع التدريجي — رسم توضيحي 1

مساعد التأخير

تحتاجون إلى مساعد صغير لـالتأخير للانتظار بين المحاولات.

// delay: resolve after ms
function delay(ms) {
  return new Promise(function (resolve) {
    setTimeout(function () { resolve(); }, ms);
  });
}

async function demoDelay() {
  console.log("wait...");
  await delay(5);
  console.log("done");
}

demoDelay();
أنماط إعادة المحاولة والتراجع التدريجي — رسم توضيحي 2

محاكاة مهمة غير مستقرة

تتيح لنا هذه المهمة الوهمية التدرّب على إعادة المحاولة دون إجراء استدعاءات شبكة فعلية.

// Unstable task: fails first N times, then succeeds
function makeUnstable(failCount, value) {
  let left = failCount;
  return async function run() {
    if (left > 0) {
      left = left - 1;
      throw new Error("temporary");
    }
    return value;
  };
}

const sometimes = makeUnstable(2, "OK");
sometimes().catch(function (e) { console.log("first:", e.message); });
أنماط إعادة المحاولة والتراجع التدريجي — رسم توضيحي 3

حلقة إعادة محاولة ثابتة

الفترة الثابتة: انتظروا المدة نفسها بين المحاولات، وتوقفوا بعد بلوغ الحد الأقصى للمحاولات.

// Retry a few times with a fixed wait
async function retryFixed(fn, tries, waitMs) {
  let lastError = null;
  for (let i = 1; i <= tries; i++) {
    try {
      return await fn();
    } catch (e) {
      lastError = e;
      console.log("attempt", i, "failed:", e.message);
      if (i < tries) {
        await delay(waitMs);
      }
    }
  }
  throw lastError;
}

(async function () {
  const job = makeUnstable(2, "OK");
  const result = await retryFixed(job, 3, 5);
  console.log("fixed result:", result);
})();
أنماط إعادة المحاولة والتراجع التدريجي — رسم توضيحي 4

التأخير التدريجي الأسي

التأخير التدريجي: زيدوا مدة الانتظار مع كل محاولة، وأضيفوا تذبذبًا طفيفًا لتجنب الارتفاعات المفاجئة.

// Exponential backoff with a tiny jitter
function jitter(ms) {
  const wiggle = Math.floor(Math.random() * 3); // 0..2
  return ms + wiggle;
}

async function retryBackoff(fn, tries, baseMs) {
  let lastError = null;
  for (let i = 1; i <= tries; i++) {
    try {
      return await fn();
    } catch (e) {
      lastError = e;
      console.log("attempt", i, "failed:", e.message);
      if (i < tries) {
        const wait = jitter(baseMs * Math.pow(2, i - 1));
        await delay(wait);
      }
    }
  }
  throw lastError;
}

(async function () {
  const job = makeUnstable(2, "OK");
  const value = await retryBackoff(job, 4, 3);
  console.log("backoff result:", value);
})();
أنماط إعادة المحاولة والتراجع التدريجي — رسم توضيحي 5

نصائح لإعادة المحاولة

نصائح:

  • أعيدوا المحاولة فقط عند حدوث أخطاء مؤقتة، مثل انتهاء المهلة وتجاوز حدود المعدل.
  • لا تعيدوا المحاولة عند إدخال بيانات غير صحيحة.
  • اجعلوا عدد المحاولات قليلًا (3–5)، وسجّلوا حالات الفشل بإيجاز.
أنماط إعادة المحاولة والتراجع التدريجي — رسم توضيحي 6

اختبار إعادة المحاولة والتأخير التدريجي

تحقق سريع: أساسيات التأخير التدريجي.

أنماط إعادة المحاولة والتراجع التدريجي — رسم توضيحي 7

مراجعة

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

أنماط إعادة المحاولة والتراجع التدريجي — رسم توضيحي 8

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

هل درس «أنماط إعادة المحاولة والتراجع التدريجي» مجاني؟

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

ماذا ستتعلم في «أنماط إعادة المحاولة والتراجع التدريجي»؟

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

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

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

كم من الوقت يستغرق درس «أنماط إعادة المحاولة والتراجع التدريجي»؟

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

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

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

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

  1. كتابة الدوال غير المتزامنة؛ try/catch؛ التنفيذ المتوازي مقابل التسلسلي
  2. المهلات والإلغاء باستخدام AbortController
  3. أنماط إعادة المحاولة والتراجع التدريجي
← العودة إلى JavaScript Academy