2016-12-28 3 views
2

私はサーバーからチャンクでデータをダウンロードしようとしています。どのくらいの反復があるのか​​分かりませんが、サーバーが "no-more-data"で応答するまでチャンクを取得するだけです。RxJs(v5)をループするには?

v4ではdoWhile演算子がありましたが、実験的で最新バージョンで削除されています。

expandを示唆していますが、まだv5でそれを行うのが最良かどうかはわかりませんが、similar questionがあります(これは重複しているとは思いませんが)。

または、私は間違った問題を解決していますか?このようなシナリオでRxJを使用するのは良い習慣ですか、または私はこの方法で使用することをお勧めしますか(例えば、expand演算子を使用して再帰を達成する、より良い方法は存在しないと仮定します)???

一般的にリアクティブエクステンションスタイルには適していない場合、なぜ彼らはdoWhile演算子を削除しましたか?

+1

私も ')(拡大'使用することをお勧めしたいが、それはあなたが解決しようとしている正確に何を示す任意のデモせずに任意の助言を与えることは難しいです。 – martin

+1

注:v5はv4の直後のフォローアップではありません。演算子が存在しないという事実は、それがまだ移植されていないか、またはAPIの表面を不必要に膨張させるとみなされたということだけを意味するかもしれません。それはおそらくGitHubの問題のリストに指摘できる問題だろう。 – paulpdaniels

答えて

-1

ストリームを終了し、それ以上のリクエストを防ぐために使用されたオブザーバーの完全な機能です。メインストリームはあなたがノーモア・データ応答を取得するときに完了観測の観測可能である

それはこのようになりますストリーム図の土地で

....

----\---------\---------\---------\-----| 
    \---r| \   \----r| \ 
       \-----r|   \---r| 

あなたがswitchmap(又はmergemap)で観察高次

0

expandを入力としてそれ自体に続く第1の入力と、通過を平らになります。入力がなくなるまでこのプロセスを繰り返します(Observable.empty())。

私はTypeScriptでデモンストレーションを書きました。

interface RSP { 
    header:string; 
    value:string; 
}; 

function requestMaker(numChunk:number) { 
    return() => { 
     numChunk > 0 ? numChunk-- : 0; 
     return Observable.of(numChunk > 0 ? ['CONT', 'value'] : ['END', 'value']).delay(300); 
    } 
} 

let simulateRequest = requestMaker(5); 

simulateRequest() 
    .expand(([header, value]) => { 
     if (header == 'CONT') { 
      return simulateRequest(); 
     } 
     else { 
      return Observable.empty(); 
     } 
    }) 
    .subscribe(
     ([header, value]) => console.log(`NEXT: ${header}-${value}`), 
     error => console.log(`ERROR: ${error}`), 
     () => console.log('completed') 
    ) 

結果:

NEXT: CONT-value 
NEXT: CONT-value 
NEXT: CONT-value 
NEXT: CONT-value 
NEXT: END-value 
completed 
関連する問題