92- دروس جافا سكربت – التزامن – JS Promises

### مقدمة إلى الوعود (Promises) في جافا سكريبت

تعتبر الوعود (Promises) في جافا سكريبت من الأدوات الأساسية التي تساعد المطورين على التعامل مع العمليات غير المتزامنة، مثل جلب البيانات من الخادم أو قراءة الملفات. قبل ظهور الوعود، كان التعامل مع العمليات غير المتزامنة يتم عادة باستخدام callbacks، ولكن هذا النهج كان يؤدي إلى ما يعرف بـ “Callback Hell” أو “جحيم الاستدعاءات”، الذي يجعل الشيفرة معقدة وصعبة القراءة والصيانة.

### ما هي الوعود (Promises)؟

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

1. **معلق (Pending)**: وهي [شركة برمجة مصرية] الحالة الابتدائية للوعد، حيث لم يكتمل أو يفشل بعد.
2. **محقق (Fulfilled)**: تعني أن العملية قد اكتملت بنجاح.
3. **مرفوض (Rejected)**: تعني أن العملية قد فشلت.

### كيفية إنشاء واستخدام الوعود

لإنشاء وعد، نستخدم الكلمة المفتاحية `new Promise` ونمرر دالة تأخذ مُعاملين: `resolve` و`reject`. يُستخدم `resolve` عند إتمام العملية بنجاح، بينما يُستخدم `reject` عند حدوث خطأ.

let myPromise = new Promise((resolve, reject) => {
    let success = true;

    if (success) {
        resolve("Operation completed successfully!");
    } else {
        reject("Operation failed.");
    }
});

### التعامل مع الوعود

للتعامل مع النتيجة النهائية للوعد، نستخدم الدوال `then` و`catch`. تُستدعى الدالة `then` عند تحقيق الوعد، بينما تُستدعى `catch` عند رفضه.

myPromise
    .then((message) => {
        console.log(message); // "Operation completed successfully!"
    })
    .catch((error) => {
        console.error(error); // "Operation failed."
    });

### أمثلة متعددة لاستخدام الوعود

#### 1. جلب البيانات من API

function fetchData(url) {
    return new Promise((resolve, reject) => {
        fetch(url)
            .then(response => {
                if (response.ok) {
                    return response.json();
                } else {
                    reject("Failed to fetch data.");
                }
            })
            .then(data => resolve(data))
            .catch(error => reject(error));
    });
}

fetchData("https://api.example.com/data")
    .then(data => console.log(data))
    .catch(error => console.error(error));

#### 2. محاكاة عملية غير متزامنة

function asyncOperation() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            let isSuccess = Math.random() > 0.5;

            if (isSuccess) {
                resolve("Async operation successful!");
            } else {
                reject("Async operation failed.");
            }
        }, 1000);
    });
}

asyncOperation()
    .then(result => console.log(result))
    .catch(error => console.error(error));

### استخدام `Promise.all`

تتيح دالة `Promise.all` تشغيل عدة وعود بشكل متزامن والانتظار حتى تكتمل جميعها. إذا نجحت جميع الوعود، يتم [شركة برمجة مصرية] استدعاء `then`، وإذا فشل أحدها، يتم استدعاء `catch`.

let promise1 = Promise.resolve(3);
let promise2 = 42;
let promise3 = new Promise((resolve, reject) => {
    setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3])
    .then(values => {
        console.log(values); // [3, 42, "foo"]
    })
    .catch(error => {
        console.error(error);
    });

### الخاتمة

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