مرجع سريع

ورقة غش وعود جافا سكريبت JavaScript Promises

دليل مرجعي سريع لوعود جافا سكريبت: المنشئ، السلسلة، معالجة الأخطاء، مجمعات الوعود (all، allSettled، race، any)، ونمط async/await.

· تاريخ النشر

يمثل الكائن Promise الإكمال النهائي (أو الفشل) لعملية غير متزامنة وقيمتها الناتجة.

حالات الوعد (Promise States)

يكون الوعد دائما في واحدة من ثلاث حالات حصرية:

  1. pending (قيد الانتظار): الحالة الأولية، لم تكتمل بنجاح ولم تُرفض بعد.
  2. fulfilled (مكتمل بنجاح): اكتملت العملية بنجاح (resolve(value)).
  3. rejected (مرفوض): فشلت العملية وحدث خطأ (reject(error)).

المنشئ والسلسلة الأساسية

const loadUser = (id) => {
  return new Promise((resolve, reject) => {
    fetch(`/api/users/${id}`)
      .then((res) => {
        if (!res.ok) throw new Error(`HTTP ${res.status}`);
        return res.json();
      })
      .then((data) => resolve(data))
      .catch((err) => reject(err));
  });
};

loadUser(42)
  .then((user) => console.log('تم التحميل بنجاح:', user.name))
  .catch((err) => console.error('Error:', err.message))
  .finally(() => console.log('انتهى الطلب بالكامل'));

المحللات الثابتة (Static Resolvers)

// وعد مكتمل بنجاح فورا
const p1 = Promise.resolve('Immediate value');

// وعد مرفوض فورا مع رسالة خطأ
const p2 = Promise.reject(new Error('Immediate failure'));

مجمعات الوعود (Promise Combinators)

الدالة السلوك وطريقة العمل شرط الفشل والإخفاق
Promise.all([p1, p2]) تنتظر حتى تكتمل جميع الوعود بنجاح يفشل بمجرد رفض أي وعد منفرد (دائرة قصر)
Promise.allSettled([p1, p2]) تنتظر انتهاء جميع الوعود بغض النظر عن النتيجة لا يفشل أبدا (يعيد تقرير حالة كل وعد)
Promise.race([p1, p2]) يستقر على نتيجة أول وعد منتهي (نجاحا أو فشلا) إذا كان أول وعد مستقر مرفوضا
Promise.any([p1, p2]) تكتمل بنجاح مع أول وعد يكتمل بنجاح إذا رُفضت جميع الوعود معا (AggregateError)
// Promise.all: انتظار عدة طلبات مستقلة معا
const [users, posts] = await Promise.all([
  fetchUsers(),
  fetchPosts()
]);

// Promise.allSettled: فحص حالات جميع الطلبات بأمان
const results = await Promise.allSettled([reqA(), reqB()]);
results.forEach((res) => {
  if (res.status === 'fulfilled') console.log('Value:', res.value);
  else console.error('Reason:', res.reason);
});

النمط المكافئ باستخدام Async / Await

async function getUserData(id) {
  try {
    const res = await fetch(`/api/users/${id}`);
    const data = await res.json();
    return data;
  } catch (err) {
    console.error('Failed to retrieve user:', err);
    throw err;
  }
}

مراجع ذات صلة

موضوعات ذات صلة