Angular 12/Typescript/rxjs: İç içe Geçmiş Promiseler ve rxjs Observable hata yönetimi
İç içe geçmiş Promiselerin ve aboneliklerin bir karışımına sahibim ve basitçe şunu yapmak istiyorum:
- Fonksiyonumu bar() çağır ve tamamen başarılı olup olmadığını ya da bir hata oluşup oluşmadığını anla
mevcut yaklaşım: Şu anda bar() fonksiyonum bir boolean Observable döndürüyor ve her hatayı ayrı ayrı ele alıyorum, Promise için .catch ile, rxjs Observable için ise hata işlemi ile:
foo(): void {
this.bar.subscribe((data: boolean) => console.log('the function call bar() was ' + data));
}
bar(): Observable<boolean> {
let subject = new Subject<boolean>();
this.httpHandler.newFoo().subscribe(
(data) =>
this.bar(data)
.then((barData) =>
this.httpHandler.updateBar().subscribe(
(barData2) => subject.next(true),
(error) => subject.next(false)))
.catch(err => subject.next(false)),
(error) => subject.next(false));
return subject.asObservable();
}
Görünüşe göre bu karmaşık ve bar() fonksiyon çağrısının herhangi bir hata olmadan bitip bitmediğini anlamak için basit bir amaç için abartılı görünüyor. İç içe geçmiş hataları baştan sona yönetmenin daha iyi bir yolu var mı?
Şimdiden teşekkürler
Cevap #1
Bence bu şu şekilde kısa ve öz yazılabilir:
this.httpHandler.newFoo().pipe(
switchMap(data =>
from(this.bar(data)).pipe(
switchMap(() =>
this.httpHandler.updateBar().pipe(
mapTo(true)
)
)
)
),
catchError(() => of(false))
)
Bir sözden (promise) observable oluşturmak için from() kullanın. Observablalar arasında geçiş yapmak için switchMap() kullanın. Sonra sadece çağrılarınızı zincirlemek meselesidir:
this.httpHandler.newFoo() -> this.bar() -> this.httpHandler.updateBar()
ve sonunda true döndürür, aksi takdirde herhangi bir hata için false döndürür.
