2017-03-06 1 views
0

私は、私のangular2ウェブサイトのヒートビートサービスを構築したいと思います。リモートデバイスはウェブサイトのホストであり、クライアントはデバイスが到達可能/オフラインでないかどうかを検出できるはずです。 サービスは(Webサーバー)リモートデバイスを定期的にポーリングする必要があります。RxJSでハートビートサービスを構築する

私は、失敗したHTTPコールをデバイス全体のオンライン/オフラインステータスと直接比較することはできませんが、私の要件は十分であるはずです。

は現在、私は、角度サービスの内側に配置され、以下の観測を使用しています:

public getStatus() { 
    return this.http.get(this.config.apiEndpoint + this.fileName) 
     .map(() => { return '1'; }) 
     .timeout(500) 
     .catch(() => {return '0';}) 
     .retry() 
     .delay(1500) 
     .repeat(); 
    } 

、観察の対象はWebサーバ上だけで、ほぼ空のファイルです。 コンポーネントはオブザーバブル/サービスに加入し、デバイスステータスが変更された場合に通知を表示します。

原則として、Observableは機能しますが、購読しているコンポーネントに連続して1(オンライン)と0(オフライン)のストリームを提供します。ここでは、通知が一度しか表示されない、たとえば2つの連続するゼロを処理するために、コンポーネント(およびこのサービスを使用する他のすべてのコンポーネント)にロジックを追加する必要があります。

サービスがこの余分な作業を行い、デバイスのステータスが変更されたときに結果(コンポーネントにのみ)を提供できるのであれば、はるかに洗練され、懸念がより明確になります。またObservable.timerflatMapを使用しようとしましたが、うまく動作しませんでしたが、rxjsがこの問題の解決策を提供すると考えています。

答えて

1

distinctUntilChanged演算子を使用すると、別個の値だけが確実に渡されます。

これが役立ちますように!

+0

私は上記の演算子を追加し、期待どおりに動作します。 – Akkusativobjekt

+0

編集:それで部分的に私の問題を解決しましたが、サービスが加入者を区別できないため、コンポーネント自体が最初の応答を無視する必要があるかどうかを知る必要があることに気付きました。だから、問題は解決しました、ありがとう! – Akkusativobjekt

関連する問題