2016-04-09 8 views
3

私は現在、RxJSのおかげでReactivelyに考えています。今、私は現在RxJSの本(Reactive Programming with RxJS)を読んでいます。私はAsyncSubjectについて読んだことがあり、受け取った最後の値をキャッシュするしか方法はありません。私が知りたいことは、サーバーを更新し、この監視可能な更新をしたい場合はどうなりますか? onCompleteが呼び出されたので、私は新しいオブザーバーを作成する必要がありますか?私が従うべき別のパターンがありますか?RxJS非同期リクエストアップデート

私の全体的な必要条件は、サーバーとの間でデータをきれいにやりとりし、常に観測可能な(モデル)を新鮮に保つことです。

おかげで、 リー

+0

ObservableとWebsocketを併用しないのはなぜですか? –

+0

あなたが求めている行動についてもっと明白になりますか?たとえば、入力と期待出力を指定するか、大理石図を描画します。また、なぜ/ who onCompleteがコールされたかを説明するといいでしょう。 – user3743222

+0

私は、毎回新しいオブザーバを作成するのではなく、必要なときにサーバを照会するだけで済みます。私は、オブザーバーがどのようにして終了するのをどうやって止めるかについてはあまりよく分かりません –

答えて

2

あなたが疑われるとしてonCompletedが呼び出された後、あなたがAsyncSubjectの値を変更することはできません。単純な「必要に応じてサーバーを呼び出す、コール間で値をキャッシュする」シナリオを処理する典型的な方法は、flatMapLatestを使用して、トリガー観測をサーバー呼び出しを表すAsyncSubjectにマップすることです。あなたには、いくつかのデータを30秒ごとにリフレッシュしたい場合たとえば、あなたはこのような何かがありますあなたの場合は

const subscription = Rx.Observable 
    .interval(30000) 
    .flatMapLatest(() => serverCall()) 
    .subscribe(x => doStuffWithResult(x)); 
+0

これは私が探していたものです。私の例では、インターバルではなく件名のトリガーを使用して、必要に応じてサーバーが照会されるようにします。 –

0

をあなたは

よう your observable (model) fresh at all times

何かをしたいので、私は、WebSocketをを使用して検討します

var source = Rx.Observable.create(function (observer) { 
    websocket.onmessage = function(msg) { 
     observer.onNext(msg); 
    } 

    websocket.onerror = function(error) { 
     observer.onError(error); 
    } 

    websocket.onclose = function (msg) { 
     observer.onComplete(msg); 
    } 
}); 

そうしないと、間隔を使用することができます

const subscription = Rx.Observable 
    .interval(1000) 
    .flatMapLatest(() => Rx.Observable.fromPromise(fetch(...).then(response => response.json()).retry(5)) 
    .subscribe(response => response); 

retry演算子を使用すると、エラーが発生した場合にすぐに断念することができます。

+0

ありがとうございます、あなたの2番目の例が良いです。 RESTインターフェイスがすでに利用可能なので、私は現在ウェブソケットを避ける必要があります。 –

関連する問題