Async / Await
كلمة مفتاحية · JavaScript
صيغة حديثة في JavaScript (ES2017) تتيح كتابة الكود غير المتزامن بطريقة تسلسلية وسهلة القراءة — تحوّل سلاسل الوعود المعقدة إلى تعليمات واضحة، وتسهّل إدارة استدعاءات API واستعلامات قواعد البيانات وكل عملية غير حاجبة.
آلية مبنية على Promises تقدم كلمتين مفتاحيتين: `async` للتصريح عن دالة غير متزامنة تُرجع وعدًا تلقائيًا، و`await` لإيقاف التنفيذ مؤقتًا حتى يتم حل هذا الوعد — مما يقضي على «جحيم الاستدعاءات الراجعة» ويجعل الكود قابلًا للصيانة على نطاق واسع.
نمط لا غنى عنه في تطوير Full-stack الحديث يُستخدم على جانب العميل (React، Next.js) وجانب الخادم (Node.js، Express.js) على حد سواء — يضمن أداءً مثاليًا من خلال تحرير الخيط الرئيسي أثناء عمليات الإدخال/الإخراج كاستدعاءات الشبكة أو قراءة الملفات.
الوعد (Promise) في JavaScript هو كائن يمثل النتيجة المستقبلية لعملية غير متزامنة — سواء نجحت أم فشلت. يمتلك ثلاث حالات: «pending» (قيد الانتظار)، «fulfilled» (تم الحل بنجاح) أو «rejected» (مرفوض مع خطأ). أحدثت الوعود ثورة في إدارة العمليات غير المتزامنة باستبدال الاستدعاءات الراجعة المتداخلة بتسلسل أنيق عبر `.then()` و`.catch()`. في Async Code، نستخدم الوعود كأساس لجميع اتصالات API وعمليات الخادم لدينا.
يُستخدم async و await عندما ينفذ الكود عملية تستغرق وقتًا: استدعاء API REST، استعلام قاعدة بيانات، قراءة ملفات أو أي معالجة شبكية. يُنصح بهما بشكل خاص عندما يجب تنفيذ عدة عمليات غير متزامنة بشكل تسلسلي أو متوازٍ باستخدام `Promise.all()`. تطبق وكالتنا Async Code بشكل منهجي async/await في مشاريع Next.js و Node.js لضمان كود قابل للقراءة وعالي الأداء وسهل الصيانة من قبل الفريق بأكمله.
لإنشاء دالة غير متزامنة في JavaScript، يكفي وضع الكلمة المفتاحية `async` قبل تعريف الدالة. على سبيل المثال: `async function fetchData() const response = await fetch('/api/data'); return response.json(); `. تحوّل الكلمة المفتاحية `async` القيمة المُرجعة تلقائيًا إلى وعد، وتُتيح استخدام `await` داخل جسم الدالة. هذه هي الصيغة المعتمدة التي نستخدمها في جميع تطبيقاتنا لإدارة الاتصالات مع Backend بشكل سليم.
Promise هو كائن JavaScript أصلي يغلف قيمة قد تكون متاحة في المستقبل، ويعمل كعقد بين منتج البيانات غير المتزامنة ومستهلكها. يضمن أن النتيجة — نجاح أو خطأ — ستتم معالجتها مرة واحدة بالضبط عبر الوظائف `.then()` و`.catch()` و`.finally()`. تشكل Promises اللبنة الأساسية التي يرتكز عليها async/await وAPI fetch والنظام البيئي الكامل للعمليات غير المتزامنة في Node.js والمتصفحات الحديثة.
الدالة غير المتزامنة هي دالة مُعلنة بالكلمة المفتاحية `async` تُرجع ضمنيًا Promise وتسمح باستخدام الكلمة المفتاحية `await` في جسمها. على عكس الدالة العادية التي تُنفَّذ بشكل متزامن وحاجب، فإنها تحرر الخيط الرئيسي أثناء انتظار عملية طويلة (استدعاء شبكي، مؤقت، قراءة ملف). هذه الآلية ضرورية للحفاظ على استجابة تطبيق الويب وتوفير تجربة مستخدم سلسة دون تجميد الواجهة.
الدالة غير المتزامنة هي دالة قادرة على تنفيذ عمليات في الخلفية دون حظر بقية التطبيق. في JavaScript، يتم إنشاؤها بالكلمة المفتاحية `async` وتسمح بـ«إيقاف» تنفيذها مؤقتًا بفضل `await` حتى تنتهي مهمة طويلة. هذا هو النمط الذي نستخدمه يوميًا في Async Code لتنسيق استدعاءات API والتفاعلات مع قواعد البيانات والمعالجات المعقدة لتطبيقات React و Next.js الخاصة بنا.
تُستخدم الكلمة المفتاحية `await` حصريًا داخل دالة مُعلنة بـ`async`. توضع قبل أي تعبير يُرجع Promise: `const data = await fetch('/api/endpoint')`. يتم إيقاف تنفيذ الدالة مؤقتًا حتى يُحل الوعد، ثم يُستأنف بالقيمة المُرجعة. لإدارة الأخطاء، غلّف استدعاءات `await` في كتلة `try/catch`. ينتج هذا النهج كودًا واضحًا وتسلسليًا أكثر قابلية للقراءة من سلاسل `.then()` المتداخلة.
يجب استخدام async/await بشكل منهجي لكل عملية إدخال/إخراج (I/O) في تطبيقات JavaScript: استدعاءات HTTP نحو API خارجية، استعلامات قاعدة بيانات MongoDB أو PostgreSQL، قراءة/كتابة ملفات مع Node.js، أو إدارة المؤقتات. وهي أيضًا الصيغة الموصى بها لـ Redux thunks و Server Components في Next.js. في Async Code، يعكس اسم وكالتنا إتقاننا لهذا النموذج الذي يقع في صميم كل سطر كود ننتجه.
الكلمة المفتاحية `await` تُستخدم في JavaScript لإيقاف تنفيذ دالة غير متزامنة مؤقتًا حتى يتم حل Promise. لا تحجب الخيط الرئيسي للمتصفح — بل توقف مؤقتًا الدالة الحالية فقط، مما يسمح للمهام الأخرى بمواصلة التنفيذ. هذه القدرة على الإدارة غير الحاجبة هي ما يجعل JavaScript عالي الأداء لتطبيقات الويب في الوقت الحقيقي والبنى المعمارية القائمة على الأحداث التي ننشرها لعملائنا.
الوعد في JavaScript هو آلية أصلية في اللغة تمثل إتمام (أو فشل) عملية غير متزامنة والقيمة الناتجة عنها. أُدخلت مع ES6، وتسمح الوعود بهيكلة الكود غير المتزامن في سلاسل مقروءة بدلًا من أهرامات الاستدعاءات الراجعة. بالاقتران مع async/await (ES2017)، توفر صيغة أنيقة ومتينة لإدارة تعقيد التطبيقات الحديثة. تعتمد وكالتنا على هذه التقنية الأساسية لبناء بنى backend موثوقة وواجهات frontend تفاعلية.