javascript - Filtreye Göre Farklı Boru RxJS


Şu sorunum var. Angular'da async pipe kullanarak bir observable'a abone olmak istiyorum. Ancak pipe içindeki veriler farklı veri kaynaklarından gelebilir ve pipe, veri kaynağına bağlı olarak farklı görünebilir.

Şu anda uygulanma şekli işe yaramıyor, çünkü this.data$ içindeki ilk değeri geçersiz kılıyorum ve bu nedenle A kaynağı hiçbir zaman abone olmuyor.

Boruyu bir filtreye bağlı olarak 'bölmek' mümkün mü?

problem.component.ts:

// Data source A and logic A 
this.data$ = this.service.context.pipe(
  filter(context => context.flag === true),
  switchMap(context => this.dataSourceA(context.id))
  map(data => this.processDataA(data))
);

// Data source B and logic B 
this.data$ = this.service.context.pipe(
  filter(context => context.flag === false),
  switchMap(context => this.dataSourceB(context.id))
  map(data => this.processDataB(data))
);

problem.component.html

<pro-table [data]="data$ | async"></pro-table>

Cevap #1

Mantığı switchMap() fonksiyonunuza taşıyın

this.data$ = this.service.context.pipe(
   switchMap(context => context.flag
      ? this.dataSourceA(context.id).pipe(map(d => this.processDataA(d)))
      : this.dataSourceB(context.id).pipe(map(d => this.processDataB(d)))
   )
);

Cevap #2

Bu, istediğiniz sonuca ulaşmak için tamamen yanlış bir yoldur. "Higher order observable" olarak adlandırılan bir şeye geçiş yapmanız gerekiyor: Observable<Observable<T>>. Tıpkı bir "higher order function" (argümanlarına bağlı olarak başka bir fonksiyon üretmeye muktedir olan) gibi, bu yapı da dayandığınız herhangi bir parametrelemeye göre başka bir Observable üretebilir.

this.service.context.pipe(
  switchMap(context => context.flag ? this.dataSourceA(context.id).pipe(...) : this.dataSourceB(context.id).pipe(...))
);

...başlangıçta biraz ezoterik görünebilir, ama aslında öyle değil. \

P.S. Hatırlanması gereken önemli nokta: yüksek mertebeden gözlemlenebilirler, akışlarınızı şık bir şekilde parametrize etmenizi sağlar: akışların akışları ile ilgilenerek.

İlgili makaleler