[英]combineLatest emit only when one of the streams changes
我有一個頻繁值的流和一個慢的流。 我希望將它們組合起來,但只在較慢的一個發出時才發出一個值。 所以combineLatest
不起作用。 像這樣:
a1
a2
b1
(a2,b1)
a3
a4
a5
b2
(a5,b2)
目前我正在這樣做,有更清潔的方式嗎?
withLatest[A,B](fast : Observable[A], slow : Observable[B]): Observable[(A,B)] =
Observable({ o =>
var last : A
fast.subscribe({a => last = a})
slow.subscribe({b => o.onNext((last,b))})
})
編輯 :此運算符現在位於Rx中,並使用LatestFrom調用。
您正在尋找的是我稱之為“combinePrev”的組合器,它在API中不存在,但在許多情況下證明是非常必要的。 sample
運算符接近,但它不會合並兩個流。 我也錯過了RxJS中的“combinePrev” 。 事實證明,“combinePrev”(“withLatest”)的實現很簡單,只取決於map和switch:
withLatest[A,B](fast : Observable[A], slow : Observable[B]): Observable[(A,B)] = {
val hotSlow = slow.publish.refCount
fast.map({a => hotSlow.map({b => (a,b)})}).switch
}
雖然運算符不在Rx中,但您可以使用隱式類,因此可以使用slow.withLatest(fast)
:
implicit class RXwithLatest[B](slow: Observable[B]) {
def withLatest[A](fast : Observable[A]) : Observable[(A,B)] = /* see above */
}
注意: slow
必須hot
。 如果slow
是一個冷Observable, withLatest
不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.