نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
العودة للتغريدات
مشكلةتم الحل

عدم انتظار الـ Promises داخل الدالة: Array.prototype.forEach does not wait for async/await في JavaScript

K
kahraba
·١٧ يوليو ٢٠٢٦·3 مشاهدة
يا شباب أنا بكتب كود في Node.js وظيفته يمر على قائمة من المعرفات (User IDs)، ويجلب بيانات كل مستخدم من قاعدة البيانات باستعمال دالة async محاطة بـ forEach.
المطلوب: تجميع كافة بيانات المستخدمين داخل مصفوفة usersData وإرجاع القائمة مكتملة بعد معالجة جميع المعرفات.
المشكلة اللي مقابلاني: الدالة بتبعت الاستجابة قبل ما كود جلب البيانات يخلص أصلًا! المصفوفة بترجع فاضية [] بالرغم من إن الكود جواه await والبيانات بتطبع في الـ console.log بعد ما تكون الصفحة خلاص اتقفلت!
JavaScript
async function fetchAllUsers(userIds) {
    const usersData = [];

    // السطر المشتبه فيه: forEach لا تحترم الـ Promises
    userIds.forEach(async (id) => {
        const user = await getUserFromDB(id); // دالة بترجع Promise
        usersData.push(user);
    });

    // السطر ده بيتنفذ فوريًا قبل ما أي await جوه forEach تخلص!
    return usersData; 
}

// دالة وهمية محاكاة لقاعدة البيانات
async function getUserFromDB(id) {
    return new Promise(resolve => setTimeout(() => resolve({ id, name: `User ${id}` }), 500));
}
مشاكل-javascriptأخطاء-async-awaitمشاكل-nodejsدالة-foreachأخطاء-promisesحل-مشاكل-javascript

التعليقات (2)

الحل المعتمد
abdelrahman
abdelrahmanمنذ 90 يوم
دالة Array.prototype.forEach في جافاسكريبت متزامنة (Synchronous) بالكامل وتصميمها لا ينتظر إنجاز الـ Promises (الوعود) التي ترجعها الدالة الممررة إليها. هي فقط تقوم بإطلاق الـ Callbacks وتستمر في تنفيذ باقي الأسطر التي يليها مباشرة دون انتظار انتهاء العمليات غير المتزامنة. الحل الصحيح والنهائي: استبدال forEach بـ Promise.all مع map لطلب تنفيذ جميع العمليات بالتوازي وانتظار مكتمل النتائج، أو استخدام حلقة for...of العادية إذا كنت تتطلب معالجتهم بالترتيب واحدة تلو الأخرى:
JavaScript
async function fetchAllUsers(userIds) {
    // بتحويل العناصر لوُعود (Promises) وانتظار انتهاء الجميع معًا
    const usersData = await Promise.all(
        userIds.map(async (id) => {
            return await getUserFromDB(id);
        })
    );

    return usersData; // ترجع المصفوفة مكتملة بنجاح
}
K
kahrabaمنذ 90 يوم
thanks you

سجّل دخولك لإضافة تعليق

تسجيل الدخول
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر