يمثل الكائن Promise الإكمال النهائي (أو الفشل) لعملية غير متزامنة وقيمتها الناتجة.
حالات الوعد (Promise States)
يكون الوعد دائما في واحدة من ثلاث حالات حصرية:
- pending (قيد الانتظار): الحالة الأولية، لم تكتمل بنجاح ولم تُرفض بعد.
- fulfilled (مكتمل بنجاح): اكتملت العملية بنجاح (
resolve(value)). - 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;
}
}