2016-06-18 4 views
0

データベースに格納された一連のイベントを再生する必要があります。だから私は、Observable TimerのObservableストリームを作成して、すべてのイベントが放出されなければならないようにしたいと思っています。私の問題は、オブジェクトをタイマーの値として出力する適切な方法が見つからないということです。オブジェクトを観測可能なタイマーの値として出力する

簡略化した(やや工夫した)例を設定しておきますが、問題が説明されています。

遅延の単純な配列が

var delays = [200,100,1000,1200,300,1100]; 

とそれらに対応する観察可能なタイマー、私はちょうど取得、これまでのところは良い

source.subscribe(x => console.log(x)); 

を観察することができ

var source= Rx.Observable 
    .for(delays, t => Rx.Observable.timer(t)); 

値との始めましょう各タイマーの完了時にゼロのリスト。

次に、この例のプルプスについては、元の順序ではなく、表現された遅延で発生したイベントを取得したいと思います。私は元の値と各タイマーの配列にインデックスを取得したいと思います。

だから、私はタイミングがacurateであるかどうかを確認するために、観測可能

​​

でシンプルなマップを追加して、私は、オブザーバーに時計を追加

var startTime = Date.now();  
    source.subscribe(x => console.log((Date.now()-startTime), x)); 

これは私が得たいものです

142 { i:1, x:100 } 
204 { i: 0, x: 200 } 
303 { i: 4, x: 300 } 
1002 { i: 2, x: 1000 } 
1101 { i: 5, x: 1100 } 
1203 { i: 3, x: 1200 } 

私は配列内の元のインデックスを取得するのではなく、それらが放出される順序を取得します。

これは私が

1046 { x: 0, i: 0 } 
1166 { x: 0, i: 1 } 
1371 { x: 0, i: 2 } 
2472 { x: 0, i: 3 } 
3673 { x: 0, i: 4 } 
3974 { x: 0, i: 5 } 

代わり得るものをオブジェクトは、タイマーの値として放出されることが持っている最もRxJS風の技術は何ですか?

答えて

1

アレイから観測可能なタイマーはflatMap、タイマーの時刻とインデックスはmapです。

const o = Rx.Observable; 
const delays = [200,100,1000,1200,300,1100]; 
const delays$ = o.from(delays) 
    .flatMap((t, i) => o.timer(t).map({t,i})); 

delays$.subscribe(x => console.log(x)); 

は私が見る問題はあなたが元の索引が、EMITのインデックスを取得していないということです

[object Object] { 
    i: 1, 
    t: 100 
} 
[object Object] { 
    i: 0, 
    t: 200 
} 
[object Object] { 
    i: 4, 
    t: 300 
} 
[object Object] { 
    i: 2, 
    t: 1000 
} 
[object Object] { 
    i: 5, 
    t: 1100 
} 
[object Object] { 
    i: 3, 
    t: 1200 
} 

jsbin example

+0

を放出します。だからあなたは本当に元のオブジェクトを回復するのではなく、遅延時間だけを回復します。私は私の質問を編集して目的をより明確にしています。 –

+0

また、イベントは、要求されたタイマーの有効期限ではなく、キューに入れられた順序で発行されます。 –

+0

私の最後のコメントを忘れて、元のメソッドが私が望む順序でイベントを発生させなかったことを発見しました。私は私の完全な戦略を再考する必要があります。 –

関連する問題