簡體   English   中英

combineLatest只在其中一個流發生變化時才會發出

[英]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
}

這是在RxJS中實現的同一運算符的jsfiddle示例。

雖然運算符不在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM