العودة إلى الدورة

الـ Observables مقابل الـ Promises: الاختلافات الرئيسية

مطور Angular الشامل: من الصفر إلى الاحتراف

52. الـ Observables مقابل الـ Promises: الاختلافات الرئيسية

يتعامل كل من Promises و Observables مع العمليات غير المتزامنة، لكن قدراتهما وسلوكهما يختلفان بشكل كبير.

الميزةPromiseObservable
القيمقيمة واحدة (يتم حلها أو رفضها مرة واحدة).قيم متعددة بمرور الوقت (تدفق).
التنفيذفوري (Eager) (يُنفذ فور إنشائه).كسول (Lazy) (يُنفذ فقط عند الاشتراك فيه).
الإلغاءغير قابل للإلغاء (يجب الانتظار للحل/الرفض).قابل للإلغاء بسهولة عبر unsubscribe().
العوامل (Operators)لا يوجد عوامل مدمجة. يتطلب مكتبات خارجية.مجموعة غنية من العوامل الوظيفية (map, filter, retry).
حالة الاستخداممهمة واحدة فورية (على سبيل المثال، قراءة ملف واحد).تدفقات بيانات مستمرة (استقصاء HTTP، الأحداث، تغييرات واجهة المستخدم).

1. Promises (قيمة واحدة، تنفيذي فوري)

javascript const promise = new Promise((resolve, reject) => { console.log('Promise executes NOW.'); setTimeout(() => resolve('Data received'), 1000); });

promise.then(value => console.log(value)); // إذا لم نستدعي .then() أبداً، فسيظل الـ Promise يُنفذ.

2. Observables (قيم متعددة، تنفيذي كسول)

الـ Observables باردة (cold)؛ تبدأ في إطلاق القيم فقط عندما يشترك فيها مُراقب (Observer).

typescript import { Observable } from 'rxjs';

const observable = new Observable(observer => { console.log('Observable setup, waiting for subscription...'); let count = 0; const intervalId = setInterval(() => { observer.next(count++); if (count > 3) { observer.complete(); clearInterval(intervalId); } }, 500);

// منطق التنظيف (إلغاء الاشتراك) return () => clearInterval(intervalId); });

// لا يحدث شيء حتى نشترك const subscription = observable.subscribe(value => { console.log('Received:', value); });

// يمكننا إلغاء التدفق في أي وقت // setTimeout(() => subscription.unsubscribe(), 1600);

يستخدم Angular قدرة التدفق في Observables لطبيعته التفاعلية.