javascript - RXJS if s observable kao uvjet
Želim koristiti Rx.Observable.if da pokrenem jedan od dva observabla ako se uvjetni observable riješi na true ili false.
Ono što želim postići izgledalo bi otprilike ovako:
Rx.Observable.if(conditionalObservable.map(x => x.length > 0), firstObservable, secondObservable).subscribe()
Ako conditionalObservable pošalje sljedeću vrijednost, a zatim se kompletira s vrijednošću true, firstObservable bi se trebao pokrenuti, a inače, secondObservable bi se trebao pokrenuti.
Sada očito to ne funkcionira jer Rx.Observable.if očekuje funkciju uvjeta, a ne observable. Kako mogu postići potpuno istu funkcionalnost u RXJS-u?
Napomena: Ovaj problem je gotovo isti, ali mislim da nije dovoljno sažet jer 1) morate imati dvije pausable naredbe i 2) osim ako ne dodate take(1) na svoje uvjetne observables, ne možete garantirati da uvjetni neće emitirati više sljedećih događaja. Po mom mišljenju, to je zaobilazno rješenje i podložno mnogo većoj ljudskoj pogrešci.
Odgovor #1
Ako dobro razumijem, mogao bi pokušati nešto takvo:
conditionalObservable.map(x => x.length > 0)
.last()
.flatMap(function(condition){
return condition ? firstObservable : secondObservable});
.subscribe()
Dodao sam last dio jer ste spomenuli da želite odabrati svoj promatrani objekt (prvi ili drugi) na posljednjoj vrijednosti conditionalObservable.
Nisam siguran u vrijednost operatora if ovdje, jer se on prebacuje na temelju skalarnog vrijednosti koja mora biti proizvedena sinkrono od strane funkcije selektora. Dakle, osim ako ne koristite tu funkciju za vraćanje varijable koja je dostupna unutar zatvaranja (closure) i koju možete mijenjati u točki gdje se vaša uvjetna provjera izvršava, po mom mišljenju nije toliko korisna. Čak i tada, vaš selektor postaje nečista funkcija što nije najbolja praksa za testiranje i slično.
Odgovor #2
Što kažete na korištenje switch?
conditionalObservable
.map(x => x.length > 0 ? firstObservable : secondObservable)
.switch()
.subscribe(...)
Ili flatMapLatest? Ako dobro razumijem dokumentaciju, ovo će učiniti isto kao i prethodno:
conditionalObservable
.flatMapLatest(x => x.length > 0 ? firstObservable : secondObservable)
.subscribe(...)
