93- دروس جافا سكربت – التزامن – JS Async/Await

### شرح مفصل لـ 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`، يمكنك كتابة كود نظيف ومنظم يُسهل على المطورين الآخرين فهمه وصيانته.