JavaScript

إتقان وعود جافا سكريبت: دليل شامل

Spread the love

تُعد العمليات غير المتزامنة العمود الفقري لتطبيقات جافا سكريبت الحديثة، خاصة عند التعامل مع المهام المرتبطة بالمدخلات/المخرجات مثل طلبات الشبكة أو عمليات الملفات. توفر الوعود طريقة منظمة وأنيقة لإدارة النتائج المحتملة لهذه الإجراءات غير المتزامنة. يستعرض هذا الدليل آليات الوعود، ودورة حياتها، وأفضل الممارسات للتعامل معها باستخدام بناء جملة `async/await` القوي.

جدول المحتويات

ما هي الوعود في جافا سكريبت؟

الوعود هي كائن يمثل إكمال العملية غير المتزامنة (أو فشلها) في نهاية المطاف. على عكس الدوال المتزامنة التي تُرجع القيم على الفور، فإن الدالة غير المتزامنة تُرجع وعدًا، يعمل كعنصر نائب لقيمة مستقبلية. ستكون هذه القيمة متاحة بمجرد انتهاء العملية غير المتزامنة.

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

دورة حياة الوعود: الحالات والانتقالات

يمكن أن توجد وعد في إحدى الحالات الثلاث:

  • معلقة: الحالة الأولية. العملية غير المتزامنة لا تزال قيد التقدم.
  • منفذة (محلولة): تم إكمال العملية بنجاح، والوعود الآن تحمل قيمة نتيجة.
  • مرفوضة: فشلت العملية، والوعود تحمل سببًا للفشل (عادةً كائن خطأ).

الانتقالات بين هذه الحالات أحادية الاتجاه: يمكن للوضع المعلق الانتقال إلى الحالة المنفذة أو المرفوضة، ولكن بمجرد أن تصبح وعدًا منفذًا أو مرفوضًا، لا يمكنه تغيير الحالة.

إتقان Async/Await للتعامل مع الوعود

توفر كلمتا المفتاح `async/await` أسلوبًا يشبه الأسلوب المتزامن للعمل مع الوعود، مما يحسن من قابلية قراءة التعليمات البرمجية ويجعل من السهل فهم التعليمات البرمجية غير المتزامنة. يعلن `async` عن دالة على أنها غير متزامنة، مما يسمح باستخدام `await` بداخلها. يوقف `await` التنفيذ حتى يتم حل (أو رفض) وعد.

معالجة الأخطاء القوية مع الوعود

معالجة الأخطاء الفعالة أمر بالغ الأهمية عند العمل مع العمليات غير المتزامنة. تُستخدم طريقة `.catch()` للتعامل مع الوعود المرفوضة. من أفضل الممارسات تضمين كتل `async/await` في عبارات `try…catch` لإدارة شاملة للأخطاء.


async function fetchData() {
  try {
    const response = await fetch('some-url');
    if (!response.ok) {
      throw new Error(`خطأ في HTTP! الحالة: ${response.status}`);
    }
    const data = await response.json();
    return data;
  } catch (error) {
    console.error('خطأ في جلب البيانات:', error);
    // تعامل مع الخطأ بشكل مناسب، على سبيل المثال، عرض رسالة خطأ، إعادة محاولة الطلب، إلخ.
    throw error; // إعادة رمي السيطرة للسماح للمستويات العليا بالتعامل مع الخطأ
  }
}

ربط الوعود للعمليات التسلسلية

عندما تعتمد عمليات غير متزامنة متعددة على بعضها البعض، يمكنك ربط الوعود باستخدام `.then()`. يتم تمرير نتيجة وعد واحد كمدخل للآخر.


fetchData()
  .then(data => processData(data))
  .then(result => displayResult(result))
  .catch(error => handleError(error));

معالجة العديد من الوعود بشكل متزامن

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


async function fetchDataFromMultipleSources() {
  const promises = [
    fetch('url1').then(response => response.json()),
    fetch('url2').then(response => response.json()),
    fetch('url3').then(response => response.json())
  ];

  try {
    const results = await Promise.all(promises);
    console.log('البيانات من جميع المصادر:', results);
  } catch (error) {
    console.error('خطأ في جلب البيانات من مصدر أو أكثر:', error);
  }
}

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *