معمل
محاكي محرك JavaScript
20 دقيقة
متوسط3 المحاولات المجانية
التعليمات
الهدف
نفّذ ثلاث دوال تختبر إتقانك لأنماط JavaScript غير المتزامنة — المهارات ذاتها التي تقيّمها مقابلات الواجهات الأمامية.
المهمة 1: توقع إخراج حلقة الأحداث
اكتب دالة predictOutput() تُرجع مصفوفة من السلاسل النصية بالترتيب الدقيق الذي ستُسجل به:
function predictOutput() {
// أرجع ترتيب console.logs لهذا الكود:
//
// console.log('A');
// setTimeout(() => console.log('B'), 0);
// Promise.resolve()
// .then(() => console.log('C'))
// .then(() => console.log('D'));
// queueMicrotask(() => console.log('E'));
// console.log('F');
return ['A', '?', '?', '?', '?', '?']; // استبدل بالترتيب الصحيح
}
المهمة 2: تنفيذ Promise.all
اكتب دالة promiseAll(promises) تعمل بشكل مطابق لـ Promise.all:
- تُحل بمصفوفة نتائج عندما تُنجز جميع الوعود
- النتائج يجب أن تحافظ على نفس ترتيب وعود الإدخال
- ترفض فورًا عندما يرفض أي وعد
- تتعامل مع القيم غير الـ Promise (تلفها بـ Promise.resolve)
- تتعامل مع إدخال مصفوفة فارغة (تُحل بـ [])
function promiseAll(promises) {
// تنفيذك هنا
}
المهمة 3: إعادة المحاولة مع التراجع الأسي
اكتب دالة retryWithBackoff(fn, maxRetries, baseDelay):
- تستدعي
fn()وتُرجع نتيجتها إذا نجحت - عند الفشل تتراجع أسّيًا: المحاولة 0 تنتظر نحو
baseDelay، والمحاولة 1 نحوbaseDelay * 2، والمحاولة 2 نحوbaseDelay * 4 maxRetriesتَعُدّ إعادات المحاولة بعد المحاولة الأولى، فـmaxRetries = 3تعني حتى 4 استدعاءات لـfn. وعند استنفادها كلها، أعِد رمي الخطأ الأخير- الاهتزاز (jitter) مقبول ومُستحسن — عشوَنة كل انتظار داخل نافذة تراجعه (مثلًا 50-100% منها) هي النسخة التي ينبغي أن تدافع عنها في المقابلة، والدرس يشرح السبب. والانتظار الصِّرف
baseDelay * 2^attemptمقبول أيضًا - يجب أن تعمل مع الدوال المتزامنة وغير المتزامنة
async function retryWithBackoff(fn, maxRetries = 3, baseDelay = 1000) {
// تنفيذك هنا
}
المتطلبات
- يجب تنفيذ الدوال الثلاث جميعها
- الكود يجب أن يكون JavaScript صالح (ES2022+)
- لا يُسمح بمكتبات خارجية
- أضف تعليقات موجزة تشرح منطقك للمهمة 1
ما يجب تقديمه
يجب أن يحتوي تقديمك على قسم ملف واحد في المحرر أدناه: ملف JavaScript يحتوي على الدوال الثلاث.
معايير التقييم
المهمة 1: يتوقع بشكل صحيح ترتيب إخراج حلقة الأحداث (A, F, C, E, D, B) مع تفسير دقيق حول طوابير المهام الصغيرة مقابل الكبيرة25 نقاط
المهمة 2: ينفذ Promise.all بشكل صحيح مع الحفاظ على الترتيب والرفض الفوري ومعالجة غير الـ Promise وحالة المصفوفة الفارغة35 نقاط
المهمة 3: ينفذ إعادة المحاولة بتراجع أسي مرتكز على baseDelay ومضاعَف في كل محاولة (والاهتزاز داخل نافذة التراجع صحيح ولا يجوز الخصم عليه)، ويجري maxRetries + 1 استدعاءً في أسوأ الحالات قبل إعادة رمي الخطأ الأخير، ويعمل مع الدوال المتزامنة وغير المتزامنة30 نقاط
جودة الكود: كود نظيف وقابل للقراءة مع تعليقات مناسبة تشرح منطق حلقة الأحداث10 نقاط
قائمة التحقق
0/7حلك
3 محاولات مجانية متبقية