2017-10-14 48 views
1

同じソースの2つのマップをマージして、結果の順序を保証したいと思います。ここで私は合格したいユニットテストです:ストリームマージの注文方法は?

const source = xs.of(1,2,3) 
    const a = source.map(v=>v*10) 
    const b = source.map(v=>v*100) 
    const hist:number[] = [] 
    xs.merge(a,b).addListener({ 
    next: v=>hist.push(v), 
    }) 
    expect(hist).toEqual([10,100,20,200,30,300]) 

現在、私は取得していた結果がこれです:

Expected value to equal: 
    [10, 100, 20, 200, 30, 300] 
Received: 
    [10, 20, 30, 100, 200, 300] 
+0

jsbinを投稿できますか?それを実験するのは簡単です。 – user3743222

答えて

2

私はxstreamとは専門家でないので、私はあなたを提案することができません解決策。しかし、他のストリーミングライブラリでよく見られるように、出力が得られている理由を説明できると思います。

あなたは2つのソースをマージしています。 of演算子は配列値を順番に出力することを保証しますが、map演算子は受信値と同じ順序で変換された値を出力することを保証しますが、merge(a,b)はaとbの値をインターリーブすることを保証しません。 aの値を順番に、bの値を順に渡すことを保証します。つまり、結果の出力に対して部分的な順序のみを保証します。

放出するべきいくつかの値が与えられたとき、どの時刻に放出すべきか、どの順番でスケジューリングに関係するかの問題。私はこの時点でxstreamに気づいていないので、スケジューラインターフェイスが公開されています。スケジューラインターフェイスから値の放出のスケジューリングをカスタマイズすることができます。したがって、デフォルトスケジューリングにバインドされています。

今戻って、あなたがそのためにそれらの値を観察する理由:

  • マージ(a、b)は、配列が
  • から即座にかつ同期
    • 発するすべての値に最初に接続
  • マージ(a、b)は直ちに放出し、SYN
    • Bをbに接続chronously

あなたは1、2、3は同期放出されていない値を取得したい場合は、あなたがそうすることをofよりも、別のオペレータを使用するか、明示的にあなたの時間制限手順を構築するために必要な配列からすべての値すなわち、t0で1、t0 + 1で2、t0 + 2で3を放出する。

+0

ありがとう、@ user3743222、説明のために。私は、ライブラリがこのユースケースのための解決策を持っているかもしれないと考えていました。これは十分一般的です。 –

2

user3743222's answerからヒントを得て、periodicを使用してリストをシーケンスします。変更

//const source = xs.of(1,2,3) 
const source = xs.periodic(1).drop(1).take(3) 

は...コンソールに生成します。

10 100 20 200 30 300 

ESNextbinデモ。

drop(1)は、で始まるperiodicを処理する1つの方法です。あるいは、map機能で++v*10を使用することもできます。

+0

ありがとう!私はソース配列のポイントはいくつかの有用なデータを含むことだと思います。例を単純にするために1,2,3で初期化しましたが、実際の状況ではデータレコードをステータス文字列にマッピングする必要があるため、ソースデータを定期的に置き換えることはできません。 –

関連する問題