rx-java のサブプロジェクトである rx-scala を使用しています。私は Scala 構文を使用しますが、誰もが理解できることを願っています。
奇妙な動作に遭遇しましたが、それがバグなのか、rx オペレーターの誤用なのかわかりません。
問題文
私はox: Observable[X]
とトリガーオブザーバブルを持っていtr: Observable[()]
ます。function を使用しoy
た変換であるオブザーバブルが必要ですが、潜在的に高価であるため、トリガーされた場合のみです。ox
f: Function[X,Y]
f
の最後の値に変換された値がない場合はox
、 にoy
なるはずですnull
。
いくつかのコメント:
ox
UIイベントの結果であるため、ホットです。ox
println
デバッグで確認したように、正しく動作します (値とタイミングの両方) 。oy
適切なタイミングで発火します。ox
null 以外の値の場合、の古い値を使用しているだけです。
現在のコード
oy = ox.sample(tr).map(f).merge(ox.map(x => null))
上記のコードの問題点は次のとおりです。最初は機能しますが、しばらくすると、 をトリガーするとtr
、の古い値にoy
適用されます。変更していないときは、繰り返しトリガーすると、結果が新しくなり、最終的に追いつきます。f
ox
ox
tr
merge
にリセットしないように を削除するnull
と、すべてが正常に機能します (おそらく、効果が非決定論的に見えるため)。
質問
提示されたコードはバグがあります。
- 私が何か間違ったことをしているかどうか知りたいです。
- 必要なものを達成する別の方法を歓迎します。
ジャブの人々のために
- ジェネリック/型注釈:
ox: Observable[X]
手段Observable<X> ox
- ラムダ:
x => null
手段x -> null