javascript - RXJS ile koşul olarak observable kullanarak if
Rx.Observable.if kullanarak, koşullu bir observable doğru veya yanlış çözülürse iki observabledan birini çalıştırmak istiyorum.
Başarmak istediğim şey yaklaşık olarak şöyle görünecektir:
Rx.Observable.if(conditionalObservable.map(x => x.length > 0), firstObservable, secondObservable).subscribe()
Eğer conditionalObservable bir next gönderir ve ardından true değeri ile tamamlanırsa, firstObservable çalıştırılmalıdır, aksi takdirde secondObservable çalıştırılmalıdır.
Şimdi açıkça bu işe yaramıyor çünkü Rx.Observable.if bir observables değil, fonksiyon koşulu bekliyor. Aynı işlevselliği RXJS'te nasıl elde edebilirim?
Not: Bu sorun neredeyse aynı ama bence yeterince öz değil çünkü 1) iki pausable ifadeniz olması gerekiyor ve 2) şartlı gözlemlerinize bir take(1) eklemezseniz, şartlının daha fazla next olayı üretmeyeceğini garanti edemezsiniz. Bence bu bir geçici çözüm ve çok daha fazla insan hatasına açık.
Cevap #1
Eğer doğru anladıysam, böyle bir şey deneyebilirsiniz:
conditionalObservable.map(x => x.length > 0)
.last()
.flatMap(function(condition){
return condition ? firstObservable : secondObservable});
.subscribe()
last kısmını ekledim çünkü conditionalObservable son değerinde hangi observable'ı (birinci veya ikinci) seçmek istediğini belirttiğin için.
Buradaki if operatörünün değerinden emin değilim, çünkü bir seçim fonksiyonu tarafından senkron şekilde üretilmesi gereken bir skaler değere göre geçiş yapıyor. Yani, o fonksiyonu bir closure içinde erişilebilen ve koşulunuzun değerlendirildiği noktada değiştirebileceğiniz bir değişkeni döndürmek için kullanmazsanız, bence çok faydalı değil. Ve hatta o zaman bile, seçim fonksiyonunuz saflığını kaybeden bir fonksiyon olur ki bu test amacıyla ve diğer durumlar için en iyi uygulama değildir.
Cevap #2
switch kullanmaya ne dersiniz?
conditionalObservable
.map(x => x.length > 0 ? firstObservable : secondObservable)
.switch()
.subscribe(...)
Ya da flatMapLatest? Eğer dokümantasyonu iyi anladıysam, bu eskisiyle aynı şeyi yapacak:
conditionalObservable
.flatMapLatest(x => x.length > 0 ? firstObservable : secondObservable)
.subscribe(...)
