الرئيسيةمن أناالدوراتالجلساتالمدونةسوق الأوامرالمناهج والباقاتالشركاء

دورات عربية متخصصة في التقنية والبرمجة والذكاء الاصطناعي.

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

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • الجلسات الفردية
  • المناهج والباقات
  • سوق الأوامر
  • المدونة

الدعم

  • الأسئلة الشائعة
  • تواصل معنا
  • سياسة الخصوصية
  • شروط استخدام التطبيق
  • سياسة الاسترجاع

© 2026 أحمد حايس. جميع الحقوق محفوظة.

الرئيسيةالدوراتالجلساتالمدونةالدخول
البرمجة بالعربي

ليه نتيجة الـ API بتطلع undefined؟ async/await للمبتدئ

مبتدئ22 يوليو 20263 دقائق قراءة
ليه نتيجة الـ API بتطلع undefined؟ async/await للمبتدئ

المستوى المطلوب: مبتدئ

لو ناديت دالة بتجيب بيانات من API، وطبعت النتيجة، ولقيتها undefined أو Promise { <pending> }، المشكلة مش في السيرفر ولا في الـ API. المقال ده هيوريك السبب بالظبط، وإزاي await بيحلها في سطر واحد.

ليه بياناتك بتطلع undefined قبل ما توصل

المشكلة باختصار

جافاسكريبت مبتستناش. لما بتنادي fetch، هي بتبعت الطلب وبتكمّل باقي الكود على طول من غير ما تقف تستنى الرد. فلو حاولت تقرأ البيانات في نفس اللحظة، بتلاقيها لسه ماوصلتش. النتيجة: undefined. ده مش باج، ده سلوك مقصود عشان البرنامج ميتجمّدش وهو مستني الشبكة.

مثال بسيط: القهوة اللي لسه ماوصلتش

تخيّل إنك طلبت قهوة من الكافيه. الباريستا قال لك "تمام، هجهّزها". دي عملية بتاخد وقت. لو انت في نفس الثانية رفعت الكوب وحاولت تشرب، هتلاقيه فاضي، لأن القهوة لسه بتتعمل.

الكلمة await معناها ببساطة: "استنى لحد ما الباريستا يسلّمك الكوب مليان، وبعدها اشرب". من غير await انت بترفع الكوب الفاضي بدري. مع await انت بتستنى القهوة الحقيقية.

المفهوم بدقة: الـ Promise والتنفيذ غير المتزامن

لما بتنادي fetch، هي مبترجّعش البيانات. هي بترجّع فورًا كائن اسمه Promise: وعد بإن البيانات هتوصل في المستقبل. الـ Promise بيبدأ في حالة pending (شغّال)، وبعد ما الرد يوصل بيتحوّل لـ fulfilled (جاهز) ومعاه القيمة.

الكلمة await بتقول للدالة الـ async: "أوقف هنا، متكمّليش، لحد ما الـ Promise ده يتحوّل لـ fulfilled، وبعدها كمّلي وخدي القيمة الحقيقية". فالفرق مش في السرعة، الفرق في متى بتقرأ القيمة.

الكود: الغلط والصح

JavaScript
// الغلط: النتيجة undefined
function getUser() {
  const user = fetch("/api/user").then(r => r.json());
  return user; // ده Promise لسه شغّال، مش البيانات
}
console.log(getUser()); // Promise { <pending> }

// الصح: باستخدام async/await
async function getUser() {
  const res = await fetch("/api/user");
  const user = await res.json();
  return user; // البيانات جاهزة فعلاً
}
getUser().then(u => console.log(u.name)); // "سارة"

ركز في نقطة مهمة: await بيشتغل جوه دالة معرّفة بـ async بس. لو حطيته بره، هيطلعلك خطأ SyntaxError.

سيناريو واقعي بالأرقام

الافتراض إن عندك لوحة تحكم بتخدم 50 ألف طلب في اليوم، وكل طلب للـ API بياخد حوالي 210 مللي ثانية عشان يرجّع. من غير await، الكود بيقرأ المتغيّر عند اللحظة صفر، قبل ما البيانات توصل بـ 210 مللي ثانية كاملة، فبيطبع undefined في كل مرة تقريبًا. مع ، التنفيذ بيقف ويكمّل بعد 210 مللي ثانية لما البيانات تبقى جاهزة فعلاً، فبتاخد القيمة الصح.

هل استفدت من المقال؟

اطّلع على المزيد من المقالات والدروس المجانية من نفس المسار المعرفي.

تصفّح المدونة
await

الـ trade-off هنا

لو عندك طلبين مستقلين وكتبتهم كده بالـ await واحد ورا التاني، انت بتخليهم يشتغلوا بالتسلسل: 210 + 210 = 420 مللي ثانية. بتكسب كود واضح وسهل القراءة، بتخسر وقت لأنهم كان ممكن يشتغلوا في نفس الوقت.

JavaScript
// بالتسلسل: ~420ms
const a = await getUser();
const b = await getOrders();

// بالتوازي: ~210ms
const [a, b] = await Promise.all([getUser(), getOrders()]);

القاعدة: استخدم await المتسلسل لما الطلب التاني محتاج نتيجة الأول. استخدم Promise.all لما الطلبات مستقلة عن بعض.

متى لا تستخدم await

متستخدمش await لو انت أصلاً مش محتاج النتيجة، زي إنك بتسجّل حدث في الخلفية (fire-and-forget) والمستخدم مش مستني رد. وكمان await مبيسرّعش الشغل اللي بيتعب المعالج نفسه (حسابات ثقيلة)، لأنه مخصوص للانتظار على حاجة بره زي الشبكة أو القرص، مش للحسابات.

الخطوة التالية

افتح أقرب دالة عندك بتنادي fetch أو axios، وشوف: هل حاطط await قبلها والدالة معرّفة async؟ لو النتيجة كانت بتطلع undefined، ده على الأرجح السبب. ضيف await وجرّب تاني.

المصادر

  • MDN — async function
  • MDN — await operator
  • MDN — Promise
  • MDN — Promise.all()
  • MDN — fetch()