2016-12-18 6 views
1

私はRESTサービスを利用するアプリケーションを持っています。誰かのたびにリクエストします。ボタンをクリックします。ただし、最初にトークンを取得してから20分ごとに更新する必要があります。ここで、所望のストリームの結合を表す大理石の図は、典型的には、要求元がトークンソースの最新の値と結合結果をトリガオペレーターをコーミングして、別のオペレーターに依存する反応パターン

TOKEN SOURCE ---------A--------------B--------------C----------------D- 
REQUEST SOURCE ----1-----------2--3---------4-----------5-------6-------- 


RESULT SOURCE ---------A1-----A2-A3--------B4----------C5------C6------- 

、しかしいかなる項目が持っていない例外がある...ですトークンストリームで発行された - この場合、最初のトークンが到着してから送信されるまで、要求はバッファされます。

オペレータはほとんど存在しますが、いずれかのストリームが発生するとトリガーされます。 sampleオペレータの大理石図も近いようですが、私が望んでいない時間間隔に基づいて出力を抑制します。

このインスタンスでは、どの演算子/演算子チェーンを使用できますか?

私はRxJSでプロトタイプを作成していますが、RxSwiftに実装する必要があります。

答えて

2

あなたは解決策に近づいていました。重要なのは、Source(2)がすべての要素を投影するのに対し、Source(1)は直接投影しないことで、余分な情報があれば、Source(1)のみが変更されたときに破棄できます。

s1.combineLatest(s2, (a, b) => [a, b]) 
    .distinctUntilChanged(v => v[1]) 

ここでテストのセットアップです:

var s1 = Rx.Observable.interval(997).take(10).map(i => String.fromCharCode(65 + i)) 
var s2 = Rx.Observable.interval(251).take(10).delay(500).skip(1) 

s1.combineLatest(s2, (a, b) => [a, b]) 
    .distinctUntilChanged(v => v[1]) 
    .subscribe(value => console.log(value)) 

出力:

[ "A"、1] [ "A"、2] [ "A"、3] は[ "A"、4] [ "B"、5] [ "B"、6] [ "B"、7] [ "B"、8] [ "C"、9]

+1

間隔のこれらの魔法値は素数なので、両方のシーケンスar eは重複しないことが保証されます。 – Asti

1

REQUEST SOURCEに基づいてデータの送信のみが開始されるようにするには、ストリームを開始してからflatMapTOKEN SOURCEに切り替えて、必要な一切高度な演算子ません:

(注意:私の仮定は、あなたのTOKEN SOURCEは、最新のトークンを再生していること、である:

var token$ = Rx.Observable.interval(1000).take(10).map(() => Math.random()).publishReplay(1); // simulating the token source: new token every second and replaying the latest token 
var requests$ = Rx.Observable.interval(250).take(10); // simulating the request source: emitting a new request every 250ms 
token$.connect(); 

requests$ 
    .flatMap(request => token$ 
     .take(1) 
     .map(token => ({request, token})) 
    ) 
    .subscribe(function(requestWithToken) { 
     console.log("Matched: ", requestWithToken); 
    }); 

あなたがここに住んでフィドルをチェックアウトすることができます:https://jsfiddle.net/rn8rzufg/

+0

ありがとう!これは、RxJSを使用しているときに 'replay'の' publishReplay'を変更すると動作します... – Brendan

関連する問題