يعتبر البرمجة غير المتزامنة في Node.js جزءًا أساسيًا من وظائفها، مما يمكّن العمليات غير المحجوزة وأداء فعال. لقد أحدثت صيغة async/await التي تم تقديمها في ES2017 ثورة في كيفية كتابة المطورين للشفرة غير المتزامنة.
فهم NodeJs
Node.js هو بيئة تشغيل جافا سكريبت تتيح لك تشغيل شفرة جافا سكريبت خارج متصفح الويب. يعتمد Node.js على محرك جافا سكريبت Google Chrome V8، ويستخدم لبناء تطبيقات الويب، لا سيما كثيفة البيانات وتطبيقات الوقت الحقيقي. كما تحتوي Node.js على مكتبة ضخمة من الوحدات والحزم التي يمكنك استخدامها لإضافة وظائف لمشاريعك. بعض فوائد Node.js هي:
- إنه سريع وقابل للتوسع، بفضل طبيعته غير المتزامنة والمبنية على الأحداث.
- إنه متعدد الأنظمة ومفتوح المصدر، مما يعني أنه يمكنك تشغيله على أنظمة تشغيل مختلفة والمساهمة في تطويره.
- إنه متسق وموحد، حيث يمكنك استخدام نفس اللغة لكل من الواجهة الأمامية والخلفية لتطبيق الويب الخاص بك.

ما هي الوعود؟
في جافا سكريبت، تعتبر الوعد كائنًا يمثل الاكتمال النهائي (أو الفشل) لعملية غير متزامنة وقيمتها الناتجة. يتيح لك العمل مع عملية غير متزامنة بشكل أكثر تزامنًا. إليك تفصيل لما هو الوعد وكيف يعمل:
الحالات: يكون الوعد في واحدة من هذه الحالات:
معلق
: الحالة الأولية، لا مُحقق ولا مرفوض.محقق
: تمت العملية بنجاح.مرفوض
: فشلت العملية.- الاستخدام: يمكنك ربط المعالجات مع قيمة النجاح النهائية أو سبب الفشل لإجراء غير متزامن. هذا يسمح للأساليب غير المتزامنة بإرجاع قيم مثل الأساليب المتزامنة: بدلاً من إرجاع القيمة النهائية على الفور، يُرجع الأسلوب غير المتزامن وعدًا لتزويد القيمة في مرحلة ما في المستقبل.
- الاستقرار: يُقال إن الوعد قد استقر إذا تم تحقيقه أو رفضه، ولكن ليس معلقًا. قد تكون الحالة النهائية للوعد المعلق إما محققة بقيمة أو مرفوضة بسبب (خطأ).
كيفية إعلان دالة غير متزامنة
إعلان دالة async
في جافا سكريبت أمر بسيط للغاية. يكفي إضافة بادئة كلمة async
إلى إعلان الدالة. هذا يشير إلى أن الدالة غير متزامنة ويمكن أن تحتوي على تعبيرات await
واحدة أو أكثر. إليك الصيغة الأساسية:
async function functionName(parameters) {
// جسم الدالة
}
إليك مثال لدالة async
تسترجع البيانات من واجهة برمجة التطبيقات:
async function fetchData(url) {
try {
const response = await fetch(url);
const data = await response.json();
return data;
} catch (error) {
console.error('حدث خطأ:', error);
}
}
في هذا المثال، fetchData
هي دالة async
تستخدم await
للانتظار لاستكمال استدعاء fetch
قبل المتابعة. إذا كان استدعاء fetch
ناجحًا، فإنها تعالج الاستجابة وترجع البيانات. إذا كان هناك خطأ، يتم التقاطه وتسجيله في وحدة التحكم.
ما هي Await؟
تُستخدم كلمة await
في جافا سكريبت داخل دالة async
لإيقاف تنفيذ الدالة حتى يتم حل Promise
. عند استخدام await
، تنتظر الدالة حتى تستقر Promise
، ثم تستأنف التنفيذ مع نتيجة Promise
. إذا تم رفض Promise
، فإن التعبير await
يقوم بإلقاء القيمة المرفوضة، مما يتيح لك التعامل معها باستخدام كتل try
/catch
.
إليك مثال بسيط لتوضيح await
:
async function getUserData() {
try {
let response = await fetch('/user/data');
let data = await response.json();
console.log(data);
} catch (error) {
console.error('حدث خطأ:', error);
}
}
getUserData();
في هذا المثال، getUserData
هي دالة async
تسترجع بيانات المستخدم. تُستخدم كلمة await
للانتظار لاستكمال استدعاء fetch
قبل المتابعة إلى السطر التالي، والذي يستخدم أيضًا await
للانتظار لاستكمال استدعاء response.json()
. إذا تم رفض أي من هذه الوعود، سيتم التقاط الخطأ في كتلة catch
.

لماذا استخدام Async/Await؟
توفر استخدام async
و await
في البرمجة، وخاصة في NodeJs، العديد من المزايا:
- تبسيط الشفرة غير المتزامنة: يسمح لك بكتابة شفرة غير متزامنة تبدو وتتصرف أكثر مثل الشفرة المتزامنة، مما يجعلها أسهل للفهم والصيانة.
- تحسين القراءة: من خلال تجنب حالة "جحيم الاستدعاء" أو "هرم الهلاك"، حيث لديك العديد من الاستدعاءات المتداخلة، تصبح الشفرة أنظف وأكثر قابلية للقراءة.
- معالجة الأخطاء: يمكّن من معالجة الأخطاء بشكل أفضل باستخدام كتل try/catch، مشابهة للشفرة المتزامنة، والتي ليست سهلة مع الأساليب التقليدية المعتمدة على الاستدعاءات.
- تدفق التحكم: يمنحك تحكمًا أفضل في تدفق العمليات غير المتزامنة، مما يتيح لك كتابة شفرة تنفذ بطريقة أكثر قابلية للتنبؤ.
- غير محجوزة: توقف
await
تنفيذ دالة غير متزامنة وتنتظر لحل الوعد دون حجز الخيط الرئيسي، مما يتيح استمرار تشغيل العمليات الأخرى في الخلفية.
معالجة الأخطاء باستخدام Async/Await
إن معالجة الأخطاء باستخدام async
/await
في جافا سكريبت هي بسيطة ومشابهة لمعالجة الأخطاء المتزامنة باستخدام كتل try
/catch
. إليك كيفية معالجة الأخطاء في دالة async
:
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.error('خطأ في استرجاع البيانات:', error);
}
}
fetchData();
في المثال أعلاه، إذا فشل استدعاء fetch
أو إذا كان هناك خطأ في تحليل JSON، سيتم التقاط الخطأ في كتلة catch
. هذا يسمح بمعالجة الأخطاء مركزيًا، وهو مفيد بشكل خاص عند التعامل مع عمليات غير متزامنة متعددة.
تذكر، يمكن أن تحدث رفضات الوعد غير المعالجة إذا لم يتم التقاط الأخطاء بشكل صحيح. من المهم التأكد من أن كل وعد لديه معالج .catch()
أو يكون ضمن كتلة try
/catch
في دالة async
لتجنب مشاكل محتملة في تطبيقك.
Async/Await مع Apidog
Apidog ليس مجرد منصة لتطوير واجهات برمجة التطبيقات؛ بل هو مجموعة شاملة تسهل دورة حياة واجهات برمجة التطبيقات بالكامل. من خلال نهجه الذي يركز على التصميم، يضمن Apidog أن تكون واجهات برمجة التطبيقات الخاصة بك ليست فقط وظيفية ولكن أيضًا بديهية وسهلة الاستخدام.
يعمل استخدام async/await مع Apidog على تحسين كفاءة التعامل مع طلبات واستجابات واجهات برمجة التطبيقات. يتيح للمطورين كتابة شفرة أنظف وأسهل للقراءة، مما يجعل تصحيح الأخطاء أمرًا سهلاً.

الخاتمة
يعد async/await في Node.js ميزة قوية تبسط كتابة الشفرة غير المتزامنة. من خلال فهم واستخدام هذه الصيغة، يمكن للمطورين كتابة تطبيقات أكثر كفاءة،Readable ومتاحة للصيانة.