الانتقال إلى المحتوى الرئيسي
الوحدة 7 · الدرس 4 من 428/32 في الدورة~12 min
دروس الوحدة (4/4)

أخطاء في التعليمات البرمجية غير المتزامنة

تفشل العمليات غير المتزامنة بشكل مختلف عن العمليات المتزامنة: الخطأ لا يصل على الفور، يصل "لاحقًا"، عندما يدخل الوعد في الحالة المرفوض. دعونا نلقي نظرة على الأداتين الرئيسيتين.

try/catch مع await

عندما تضع await قبل الوعد الذي فشل، تتم إعادة ظهور الخطأ كـ الاستثناء العادي: يمكنك اكتشافه باستخدام try/catch.

JS
async function safeRead() {
  try {
    const r = await fetch('/api/cose');
    if (!r.ok) throw new Error('HTTP ' + r.status);
    return await r.json();
  } catch (err) {
    console.error('network error:', err.message);
    return null;
  }
}

إنه النمط الأكثر قابلية للقراءة: تكتب "الطريق السعيد" خطيًا، وتتعامل مع كل شيء في كتلة واحدة.

.catch على الوعد

بأسلوب بالسلاسل:

JS
fetch('/api/cose')
  .then((r) => r.json())
  .then((data) => console.log(data))
  .catch((err) => console.error(err));

.catch يكتشف أي خطأ تم طرحه على طول السلسلة السابقة.

Promise.all فشل في الرفض الأول

JS
const ps = [Promise.resolve(1), Promise.reject(new Error('no')), Promise.resolve(3)];
try {
  const r = await Promise.all(ps);
} catch (err) {
  console.log(err.message); // 'no'
}

تستمر الوعود الأخرى في العمل في الخلفية، ولكن Promise.all "تستقر" عند الخطأ الأول. إذا كنت تريد نتائجها جميعًا (بما في ذلك حالات الفشل)، فاستخدم Promise.allSettled:

JS
const outcomes = await Promise.allSettled(ps);
// [{ status: 'fulfilled', value: 1 },
//  { status: 'rejected', reason: Error('no') },
//  { status: 'fulfilled', value: 3 }]

جربه

تمرين#js.m7.l4.e1
المحاولات: 0جارٍ التحميل…

حدد readOrFallback(p, Fallback)` غير متزامن: حاول انتظار الوعد p؛ إذا تم رفضه، قم بإرجاع الإجراء الاحتياطي.

جارٍ تحميل المحرر…
إظهار التلميح

حاول { العودة تنتظر ص؛ } قبض على العودة الاحتياطية؛ }

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#js.m7.l4.e2
المحاولات: 0جارٍ التحميل…

حدد `allOrNothing(promises)` غير متزامن: استخدم Promise.all. إذا فشل واحد على الأقل، قم بإرجاع المصفوفة الفارغة []. وإلا قم بإرجاع القيم.

جارٍ تحميل المحرر…
إظهار التلميح

حاول { العودة في انتظار Promise.all(promises); } قبض على { العودة []؛ }

الحل متاح بعد 3 من المحاولات