📁 آخر الأخبار

الوعود (Promises)


الوعود (Promises) هي مفهوم في البرمجة غير المتزامنة (Asynchronous Programming) تستخدم للتعامل مع العمليات التي قد تستغرق وقتًا طويلًا، مثل الاتصال بخادم، قراءة الملفات، أو إجراء العمليات الحسابية الكبيرة. تم تقديم هذا المفهوم لأول مرة في لغات مثل JavaScript كطريقة للتعامل مع العمليات غير المتزامنة بشكل أكثر تنظيمًا وسهولة، حيث يسمح بتحسين كتابة التعليمات البرمجية وتجنب ما يُعرف بـ "جحيم ردود النداء" (Callback Hell).

ما هي الوعود؟

الوعود هي كائن يمثل العملية غير المتزامنة التي يمكن أن تكتمل في المستقبل. هذا الكائن يمكن أن يكون في واحدة من ثلاث حالات:

  1. معلقة (Pending): العملية لم تكتمل بعد.
  2. منجزة (Fulfilled): العملية اكتملت بنجاح وتم إرجاع النتيجة.
  3. مرفوضة (Rejected): العملية فشلت وتم إرجاع خطأ.

كيفية عمل الوعود

يتم إنشاء الوعد باستخدام مُنشئ (constructor) Promise والذي يأخذ وظيفة تضم اثنين من الوسائط: resolve و reject.

  • resolve: يُستدعى عندما تنجح العملية غير المتزامنة.
  • reject: يُستدعى عند حدوث خطأ.

مثال بسيط:

  • javascript
let promise = new Promise((resolve, reject) => {
let success = true; // افتراض أن العملية نجحت if (success) { resolve("Operation Successful!"); } else { reject("Operation Failed!"); } });

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

لتحديد ما يجب فعله عند اكتمال الوعد، يتم استخدام الأسلوبين then و catch.

  • then: يستخدم لاستلام النتيجة عند اكتمال العملية بنجاح.
  • catch: يستخدم للتعامل مع الأخطاء في حالة فشل العملية.

مثال:

  • javascript
promise
.then(result => { console.log(result); // ستعرض: Operation Successful! }) .catch(error => { console.error(error); // ستعرض: Operation Failed! });

استخدام الوعود في العمليات غير المتزامنة

واحدة من الاستخدامات الشائعة للوعود هي التعامل مع طلبات الشبكة (HTTP requests) مثل استخدام fetch في JavaScript. يقوم fetch بإرجاع وعد (Promise) يتم حله عند استلام البيانات من الخادم.

مثال:

  • javascript
fetch('https://api.example.com/data')
.then(response => response.json()) // تحويل الاستجابة إلى JSON .then(data => console.log(data)) // التعامل مع البيانات .catch(error => console.error('Error:', error)); // التعامل مع الأخطاء

تسلسل الوعود (Promise Chaining)

أحد مزايا الوعود هو إمكانية تسلسلها بسهولة. يسمح تسلسل الوعود بتنفيذ عدة عمليات غير متزامنة بالتتابع. في كل خطوة، يتم تمرير النتيجة إلى الوعد التالي.

مثال:

  • javascript
fetch('https://api.example.com/data')
.then(response => response.json()) .then(data => { console.log(data); return fetch('https://api.example.com/more-data'); }) .then(moreDataResponse => moreDataResponse.json()) .then(moreData => console.log(moreData)) .catch(error => console.error('Error:', error));

الجمع بين عدة وعود

يمكن استخدام Promise.all لجمع عدة وعود وتشغيلها بالتوازي، حيث يتم حل الوعد الجديد الذي يرجعه Promise.all عندما يتم حل جميع الوعود الأصلية.

مثال:

  • javascript
let promise1 = fetch('https://api.example.com/data1');
let promise2 = fetch('https://api.example.com/data2'); Promise.all([promise1, promise2]) .then(responses => Promise.all(responses.map(response => response.json()))) .then(data => { console.log(data[0]); // البيانات من الوعد الأول console.log(data[1]); // البيانات من الوعد الثاني }) .catch(error => console.error('Error:', error));

الوعود مقابل ردود النداء (Callbacks)

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

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

مميزات استخدام الوعود

  1. سهولة القراءة: الوعود تسهل كتابة الكود غير المتزامن بشكل متسلسل وواضح.
  2. إدارة الأخطاء: يمكن بسهولة التعامل مع الأخطاء عبر catch دون الحاجة إلى وضع شروط متعددة.
  3. التوسيع: يمكن دمج وتوسيع الوعود بسهولة لإنشاء عمليات أكثر تعقيدًا (مثل تسلسل الوعود أو استخدام Promise.all).
  4. تفادي جحيم ردود النداء: تساعد الوعود في تجنب التعقيد الذي ينشأ عند استخدام العديد من ردود النداء المتداخلة.

استخدام async و await

لتبسيط التعامل مع الوعود أكثر، تم تقديم الكلمات المفتاحية async و await في JavaScript و Python وغيرها. تتيح هذه الميزات كتابة الكود غير المتزامن وكأنه متزامن، مما يسهل قراءة الكود.

مثال:

  • javascript
async function fetchData() {
try { let response = await fetch('https://api.example.com/data'); let data = await response.json(); console.log(data); } catch (error) { console.error('Error:', error); } } fetchData();

التحديات

رغم الفوائد الكبيرة لاستخدام الوعود، إلا أن هناك بعض التحديات:

  1. إدارة التزامن المعقدة: في بعض الحالات، قد يصبح التعامل مع العمليات غير المتزامنة المعقدة صعبًا ويتطلب استخدام مكتبات أو أدوات إضافية.
  2. التعامل مع الأخطاء: إذا لم يتم التعامل مع جميع الأخطاء بشكل صحيح، يمكن أن تؤدي إلى توقف البرامج.

ختاما:

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


تعليقات