55. العوامل المشتركة: tap و delay و catchError
تُعد هذه العوامل بالغة الأهمية لتصحيح الأخطاء، والتحكم في التوقيت، والتعامل مع حالات فشل التدفق.
1. tap (الآثار الجانبية)
يسمح لك tap بتنفيذ آثار جانبية (مثل التسجيل، وتعيين حالة المكون، وتصحيح الأخطاء) دون تغيير القيم التي تمر عبر تدفق Observable.
typescript import { tap } from 'rxjs/operators';
this.dataService.getUsers().pipe( tap(data => { // هذا مفيد لتصحيح الأخطاء: انظر إلى البيانات قبل المعالجة console.log('DEBUG: Data received from API:', data); this.isLoading = false; // تعيين حالة المكون هنا (أثر جانبي) }), map(users => users.length) // يستمر الـ pipe كالمعتاد ).subscribe(count => console.log('Total users:', count));
2. delay (التحكم في التوقيت)
يوقف delay التدفق مؤقتاً لوقت محدد قبل إعادة إطلاق القيمة. مفيد لمحاكاة زمن انتقال الشبكة أو الانتقالات المرئية.
typescript import { delay } from 'rxjs/operators';
of('A', 'B', 'C').pipe( delay(2000) // الانتظار ثانيتين قبل إطلاق التسلسل ).subscribe(val => console.log(val));
3. catchError (معالجة الأخطاء)
كما نوقش في قسم HTTP، يعترض catchError الأخطاء من Observable المصدر. يسمح لك بالتعامل مع الخطأ، وتسجيله، ثم إما إعادة رمي الخطأ أو توفير تدفق Observable جديد للحفاظ على تشغيل التطبيق (تدفق احتياطي).
typescript import { catchError, of } from 'rxjs/operators'; import { throwError } from 'rxjs';
// ... تخيل Observable قد يفشل
failedObservable$.pipe( catchError(err => { console.error('Operation failed, using fallback data.', err); // الخيار 1: توفير قيمة/تدفق احتياطي (يستمر التدفق) return of([]);
// الخيار 2: إعادة رمي خطأ جديد (ينتهي التدفق)
// return throwError(() => new Error('Critical failure'));
}) ).subscribe(data => { // ستكون البيانات هي البيانات الأصلية أو المصفوفة الفارغة الاحتياطية });