javascript - RXJS if havainnollistettuna ehdollisena
Haluan käyttää Rx.Observable.if suorittamaan toisen kahdesta observablesta, jos ehdollinen observable ratkaisee arvoksi true tai false.
Mitä haluan saavuttaa, näyttäisi jotenkin tältä:
Rx.Observable.if(conditionalObservable.map(x => x.length > 0), firstObservable, secondObservable).subscribe()
Jos conditionalObservable lähettää next-arvon ja sitten suorittaa loppuun tosi-arvolla, firstObservable pitäisi suorittaa, ja muuten secondObservable pitäisi suorittaa.
Nyt ilmiselvästi se ei toimi, koska Rx.Observable.if odottaa funktioehtoa, ei havaittavaa. Kuinka voin saavuttaa täysin saman toiminnallisuuden RXJS:ssä?
Huomautus: Tämä ongelma on melkein sama, mutta en usko sen olevan tarpeeksi tiivis, koska 1) sinun täytyy olla kaksi pausable-lausetta ja 2) ellei liitä take(1) ehdollisiin havaintoihisi, et voi taata, etteikö ehto lähettäisi lisää next-tapahtumia. Mielestäni se on kiertotie ja altis paljon enemmän inhimillisille virheille.
Vastaus #1
Jos ymmärrän oikein, voisit kokeilla jotain tällaista:
conditionalObservable.map(x => x.length > 0)
.last()
.flatMap(function(condition){
return condition ? firstObservable : secondObservable});
.subscribe()
Lisäsin last-osan, koska mainitsit haluavasi valita havaittavasi (ensimmäisen tai toisen) conditionalObservable-viimeisen arvon perusteella.
En ole varma if-operaattorin arvosta tässä, koska se vaihtaa skalaarisen arvon perusteella, joka on tuotettava synkronisesti valitsijafunktiolla. Joten ellei käytä tuota funktiota palauttamaan muuttujaa, joka on saavutettavissa sulkeumassa ja jota voi muokata siinä kohdassa, jossa ehtosi arvioidaan, se ei mielestäni ole kovin hyödyllinen. Ja jopa silloin valitsijastasi tulee epäpuhtausfunktio, mikä ei ole paras käytäntö testaus- tai muissa tarkoituksissa.
Vastaus #2
Entäpä käyttää switch?
conditionalObservable
.map(x => x.length > 0 ? firstObservable : secondObservable)
.switch()
.subscribe(...)
Tai flatMapLatest? Jos ymmärrän dokumentaation oikein, tämä tekee saman kuin edellinen:
conditionalObservable
.flatMapLatest(x => x.length > 0 ? firstObservable : secondObservable)
.subscribe(...)
