الوحدة 9: البرمجة غير المتزامنة (Asynchronous Programming) في JavaScript
إليك كورس كامل عن الوحدة 9: البرمجة غير المتزامنة (Asynchronous Programming) في JavaScript، والتي تشرح كيفية التعامل مع العمليات غير المتزامنة في JavaScript، وكيفية استخدام التقنيات المختلفة مثل الـ Promises و Async/Await.
الوحدة 9: البرمجة غير المتزامنة (Asynchronous Programming) في JavaScript
الدرس 1: مقدمة في البرمجة غير المتزامنة
- المفهوم الأساسي: البرمجة غير المتزامنة هي نمط في البرمجة يسمح بتنفيذ العمليات بشكل غير متسلسل، بحيث لا تحتاج العمليات التي تستغرق وقتًا طويلًا (مثل تحميل البيانات من الخادم أو قراءة الملفات) إلى إيقاف تنفيذ البرنامج.
1. لماذا نحتاج إلى البرمجة غير المتزامنة؟
- عند تنفيذ العمليات المتزامنة، إذا كانت إحدى العمليات تستغرق وقتًا طويلًا، مثل الاتصال بالخادم، فإن باقي العمليات تتوقف حتى تنتهي العملية الطويلة. لكن في البرمجة غير المتزامنة، يتم تنفيذ العمليات بشكل غير متسلسل مما يحسن الأداء ويجعل التطبيق أكثر استجابة.
الدرس 2: فهم الـ Callbacks (الدوال الراجعة)
- المفهوم: الـ Callback هو دالة يتم تمريرها كوسيط لدالة أخرى، ويتم استدعاؤها عند اكتمال العملية.
1. مثال بسيط على Callbacks
- عند استخدام callbacks، يمكن استدعاء دالة بعد إتمام عملية معينة.
2. عيوب استخدام Callbacks
- Callback Hell: عندما يتم تمرير العديد من الـ callbacks المتداخلة، قد يصبح الكود غير قابل للقراءة والصيانة. هذا يُعرف بـ Callback Hell.
الدرس 3: استخدام الـ Promises
- المفهوم: الـ Promise هو كائن يُستخدم للتعامل مع العمليات غير المتزامنة بطريقة أكثر وضوحًا، حيث يسمح بتحديد ما يجب فعله عندما تنتهي العملية أو عندما تفشل.
1. إنشاء Promise
- عند إنشاء Promise، يتم تنفيذ دالة تحتوي على عملية غير متزامنة، وإذا نجحت، يتم استدعاء الدالة
resolve
، وإذا فشلت، يتم استدعاء الدالةreject
.
2. سلسلة الـ Promises
- يمكن استخدام
then()
لربط عدة عمليات غير متزامنة.
الدرس 4: استخدام الـ Async/Await
- المفهوم:
async
وawait
هما جزء من JavaScript يسمحان بكتابة الكود المتزامن بشكل غير متزامن باستخدام promises. تجعل هذه الطريقة الكود أكثر نظافة ووضوحًا.
1. تعريف دالة async
- عند استخدام
async
في دالة، يتم تحويل هذه الدالة إلى دالة ترجع Promise، ويصبح من الممكن استخدامawait
بداخلها.
2. استخدام await
مع الـ Promises
await
تستخدم لانتظار إتمام العملية داخل دالةasync
، حيث توقف تنفيذ الكود حتى ينتهي الـ Promise.
3. التعامل مع الأخطاء باستخدام try/catch
- مع استخدام
async/await
، يمكن استخدامtry/catch
للتعامل مع الأخطاء في العمليات غير المتزامنة.
الدرس 5: عمليات متعددة غير متزامنة (Concurrency)
- المفهوم: أحيانًا نحتاج إلى التعامل مع عدة عمليات غير متزامنة في نفس الوقت (التوازي). يمكن استخدام
Promise.all()
أوPromise.race()
لتحقيق ذلك.
1. Promise.all()
Promise.all()
يسمح بتشغيل عدة عمليات غير متزامنة في نفس الوقت وانتظار أن تكتمل جميعها.
2. Promise.race()
Promise.race()
ينتظر أي عملية تنتهي أولًا ويعود بالنتيجة.
الدرس 6: تنفيذ العمليات غير المتزامنة في الوقت الفعلي
- المفهوم: في التطبيقات الحية مثل التطبيقات التي تتطلب تحديثات في الوقت الفعلي (مثل تطبيقات الدردشة أو الألعاب)، قد تحتاج إلى البرمجة غير المتزامنة لضمان استجابة سريعة.
1. استخدام Web APIs مع async/await
- يمكنك التعامل مع واجهات برمجة التطبيقات (APIs) خارجية في JavaScript باستخدام
fetch
معasync/await
لتحميل البيانات في الوقت الفعلي.
الدرس 7: تلخيص الوحدة
- البرمجة غير المتزامنة هي أسلوب يسمح بإجراء العمليات دون التأثير على سير البرنامج.
- Callbacks: طريقة قديمة للتعامل مع العمليات غير المتزامنة، لكن قد تؤدي إلى “Callback Hell”.
- Promises: توفر طريقة أكثر مرونة وأوضح للتعامل مع العمليات غير المتزامنة.
- Async/Await: تجعل كتابة الكود غير المتزامن مشابهة للكود المتزامن، مما يسهل القراءة والصيانة.
- التوازي: يمكن استخدام
Promise.all()
وPromise.race()
لإدارة عدة عمليات غير متزامنة.
المشاريع العملية للوحدة 9:
- مشروع 1: بناء تطبيق يقوم بتحميل البيانات من عدة واجهات برمجة التطبيقات (APIs) بشكل متوازي ويعرض النتائج.
- مشروع 2: تصميم تطبيق دردشة بسيط يستخدم
async/await
لتحميل الرسائل في الوقت الفعلي. - مشروع 3: إنشاء تطبيق لعرض حالة الطقس باستخدام
fetch
وasync/await
.