2016-03-27 7 views
2

サーバーからフェッチされたデータを含むObservableが3つあります(すべて同じタイプ)。データをうまく表示するために、空のデータポイントをストリームに追加して、時刻が整列するようにします(データの記録時刻)。このようなもの:Observableにデータを追加する

Stream 1: 12:30 ------ 15:30 -- 16:00 ----------------- 19:00 
Stream 2: 12:30 --------------- 16:00 ------ 17:30 ---------- 
Stream 3: -------------15:30 -------------------------- 19:00 
        |       | 
        V       V 
Stream 1: 12:30 ------ 15:30 -- 16:00 ------(17:30)---- 19:00 
Stream 2: 12:30 ------(15:30)-- 16:00 ------ 17:30 ----(19:00) 
Stream 3:(12:30)-------15:30 --(16:00)------(17:30)---- 19:00 

括弧は空です。 これを行うには良い方法がありますか?それとも完全に変更する必要がありますか?

+0

多分あなたは 'merge'' concat'のようなsmthを必要としますか? – xgrommx

答えて

0

combineLatestは、3つのストリームをすべて1に結合する必要がある場合に役立ちます。出力ストリームが3つ必要な場合は、withLatestFromまたはsampleとしてください。 withLatestFromを使用すると、ソースであるsampleを直接組み合わせて元の値を出力するセレクタ関数を記述できます。サンプルと比較してwithLatestFromのパラメータを逆にする必要があることに注意してください。

2つのソースが非常に近い連続して放出されたときに、新しいストリームがただ1つの値を放出したいと思うかもしれません。 debounceでこれを行うことができます。

combineLatestためのコードまっすぐ前方本当にです:

Rx.Observable.combineLatest(source1, source2, source3, (s1, s2, s3) => ...) 
    .debounce(10) 

結果で:

Stream 1: 12:30 ------ 15:30 -- 16:00 ----------------- 19:00 
Stream 2: 12:30 --------------- 16:00 ------ 17:30 ---------- 
Stream 3: -------------15:30 -------------------------- 19:00 
        |       | 
        V       V 
Stream: 12:30 ------ 15:30 -- 16:00 -------17:30----- 19:00 

我々は3つのストリームをしたい場合は、私たちがwithLatestFromを使用します。

var streams = Rx.Observable.merge(source1, source2, source3); 
s1 = source1.sample(sources).debounce(10); 
s2 = source2.sample(sources).debounce(10); 
s3 = stream3.sample(sources).debounce(10); 

か、我々の場合withLatestFrom

s1 = streams.withLatestFrom(source1).debounce(10); 

結果:

Stream 1: 12:30 ------ 15:30 -- 16:00 ----------------- 19:00 
Stream 2: 12:30 --------------- 16:00 ------ 17:30 ---------- 
Stream 3: -------------15:30 -------------------------- 19:00 
        |       | 
        V       V 
Stream 1: 12:30 ------ 15:30 -- 16:00 ------ 16:00 ---- 19:00 
Stream 2: 12:30 -------12:30 -- 16:00 ------ 17:30 ---- 17:30 
Stream 3: -------------15:30 -- 15:30 ------ 15:30 ---- 19:00 

私はあなたが "括弧は空を意味する" との意味を100%わかりません。このような大理石が欲しいですか?

Stream 1: a ---- b ------------ c --------- d --------- 
Stream 2: g ---- i -----k------ l --------- m --------- 
Stream 3: h ---- j ------------ i ----u---- a --------- 
        |       | 
        V       V 
Stream 1: a ---- b -----_------ c ----_---- d --------- 
Stream 2: g ---- i -----k------ l ----_---- m --------- 
Stream 3: h ---- j -----_------ i ----u---- a --------- 

_は空の要素ですか?

source1.sample(Rx.Observable.merge(source1, source2, source3)) 
    .debounce(10) 
    .startWith("_") 
    .publish(xs => xs.zip(xs.skip(1)), (a, b) => a === b ? "_", b) 

私たちは、その後、sampleを使用しますが、重複する値をフィルタリングし、空の要素に置き換えることができます。これを行うには、最後の2つの要素を比較する小さなトリックを使用します。等しい場合は空の値を挿入します。

+0

基本的には、あなたの最後のMarbeダイアグラムが示していることですが、日付が付いていることを意味します。日付はモデルの一部です。アンダースコアの代わりに、空のモデルには日付といくつかのデフォルト値が含まれていなければなりません。私の関数は次のようになります:[Pastebin](http://pastebin.com/jHZfT4ww) – SuperManitu

+0

私は、デフォルト値がキーを受け取り、デフォルト値を出力する関数を通して渡されるということを付け加えたいと思います。私の例では、キーはタイムコードであり、結果のデフォルト値は必要なデフォルト値と日付を持つモデルです。 – SuperManitu

+0

@SuperManitu私の現在の答えはちょっとうんざりです。私は 'sample'が良い選択だと気付いたときに' withLatestFrom'を 'sample'に置き換えました。しかし、私はそこでいくつかの間違いを犯したと思います。私は後でそれを掃除します。 – Dorus

関連する問題