### شرح مفصل لـ Async/Await في JavaScript
تُعتبر البرمجة غير المتزامنة (Asynchronous Programming) واحدة من المفاهيم الأساسية في تطوير الويب الحديث باستخدام JavaScript. وقد تم تقديم Async/Await كجزء من ECMAScript 2017 (ES8) لتسهيل كتابة الكود غير المتزامن والتعامل مع الوعود (Promises) بطريقة أكثر وضوحًا وسهولة.
#### ما [شركة برمجة مصرية] هو Async/Await؟
Async/Await هو بناء نحوي يُمكِّن المطورين من كتابة الكود غير المتزامن كما لو كان متزامنًا. يوفر `async` و `await` طريقة للتعامل مع الوعود بطريقة أكثر قراءة وفهمًا مما هو عليه عند استخدام `.then()` و `.catch()`.
##### الكلمة المفتاحية `async`
عند تعريف دالة بـ `async`، فإنها تُعيد تلقائيًا وعدًا (Promise). يمكن استخدام `await` داخل هذه الدالة لانتظار تنفيذ العمليات غير المتزامنة.
##### الكلمة المفتاحية `await`
الكلمة `await` تُستخدم فقط داخل الدوال المعرفة بـ `async`. وهي تنتظر حتى يتم تنفيذ الوعد المُراد قبل المتابعة إلى السطر التالي من الكود. إذا كان الوعد (Promise) ناجحًا، فإن `await` تُعيد القيمة التي وعد بها الوعد. وإذا فشل الوعد، فإنها تُلقي استثناءً يمكن القبض عليه باستخدام كتلة `try/catch`.
#### أمثلة توضيحية
##### المثال الأول: استخدام `async` و `await` مع وعد بسيط
function انتظرثانية() {
return new Promise(resolve => {
setTimeout(() => {
resolve("انتهى الانتظار");
}, 1000);
});
}
async function تنفيذ() {
console.log("الانتظار يبدأ...");
const نتيجة = await انتظرثانية();
console.log(نتيجة); // "انتهى الانتظار"
console.log("تم!");
}
تنفيذ();
في هذا المثال، الدالة `انتظرثانية` تُعيد وعدًا يُنفذ بعد ثانية واحدة. الدالة `تنفيذ` معرفة بـ `async` وتستخدم `await` لانتظار نتيجة الوعد قبل المتابعة.
##### المثال الثاني: التعامل مع الأخطاء باستخدام `try/catch`
function وعديرفض() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject("حدث خطأ ما!");
}, 1000);
});
}
async function تنفيذمعأخطاء() {
try {
const نتيجة = await وعديرفض();
console.log(نتيجة);
} catch (الخطأ) {
console.error("تم القبض على الخطأ:", الخطأ);
}
}
تنفيذمعأخطاء();
هنا، الدالة `وعديرفض` تُعيد وعدًا يرفض بعد ثانية واحدة. باستخدام كتلة `try/catch`، يمكننا القبض على الخطأ ومعالجته بطريقة آمنة.
##### المثال الثالث: استدعاء وعود متعددة بالتتابع
function جلببيانات(id) {
return new Promise(resolve => {
setTimeout(() => {
resolve(`بيانات للمعرف: ${id}`);
}, 1000);
});
}
async function تنفيذتتابعي() {
const بيانات1 = await جلببيانات(1);
console.log(بيانات1); // "بيانات للمعرف: 1"
const بيانات2 = await جلببيانات(2);
console.log(بيانات2); // [شركة برمجة مصرية] "بيانات للمعرف: 2"
}
تنفيذتتابعي();
في هذا المثال، نقوم باستدعاء وعدين بالتتابع باستخدام `await`، مما يُظهر كيف يمكن تسلسل العمليات غير المتزامنة بطريقة سهلة الفهم.
#### الختام
يُعتبر Async/Await تحسينًا كبيرًا على أسلوب كتابة الكود غير المتزامن في JavaScript. فهو يُبسط القراءة والفهم، ويجعل التعامل مع الأخطاء أكثر وضوحًا. من خلال استخدام `async` و `await`، يمكنك كتابة كود نظيف ومنظم يُسهل على المطورين الآخرين فهمه وصيانته.
