2017-05-18 6 views
0

ObservablesでAngular 2内でポーリングを実行しようとしています。私はそこに他の多くの答えがあることを知っていますが、私は彼らが私のために働くようにすることはできません。Http Service Observableを使ったポーリング

私はその純粋な理解のことを知っています。したがって、純粋なコードではなく、その答えとその理由についての説明が分かります。

this._service 
      .get() 
      .subscribe(
       res=> { 
        this.headers= res.headers; 
        this.data = res.dataSet; 
}); 

しかし、私の問題は、ポーリングしている:簡単な購読で期待通り、このサービスを呼び出す

test.service.ts

@Injectable() 
export class EtlService { 

constructor(private http: Http) { } 

//Get ETL by status 
get(): Observable<EtlByStatus> { 
    var url = 'someURL'; 

    return this.http 
     .get(url) 

     .map(response => { 
      return { 
       headers: response.json().data.headers, 
       dataSet: response.json().data.data 
      } 
     }); 
} 

で動作します。私が知る限り、Componentからポーリングを行うことで、サービスをより再利用できるようにする必要があります.HTTPリクエストはシンプルで、さまざまな方法で処理できます。

test.component.ts

pollGet(timer: number = 30000): Observable<GetInterface> { 
     return Observable.interval(timer) 
      .switchMap((res) => { 
       this._service.get(); 
      }) 
      .map(res => res) 
      .subscribe(res => { 
       console.log('testing'); 
      }) 
    } 

上記戻りres => void is not assignabletype void is not assignable to type ObservableInput。真ん中のゲットラインをリターンに変えようとしましたが、それはエラーを多く返し、subscribeが関数であるというメッセージを返します。

このように、Observablesをどのようにポーリングに使用しますか? mapswitchMapsubscribeという私の理解と、それらがすべてobservableの一部としてどのように演奏されているかは分かりますが、わかりません。

+0

の可能性のある重複した[観測可能なポーリング?](http://stackoverflow.com/questions/42657380/observable-polling) – stevenvanc

+0

は、それは似ていますが、トップの答えは、間隔を使用していません。 2番目の答えはありますが、コードが何をしているのか、その理由については説明がありません。 – Doug

答えて

1

あなたの関数pollGetは、再利用可能な原理に基づいて、Observable<GetInterface>を返すために出席しているので、は最終的には、サブスクライブ、それはsubscriptionに戻り値の型に変わりますので、ここでは収まりません。

についてswitchMap

switchMapswitchMap観測元観測の結果に基づいて観察鎖を合成するために使用されます。ここではObservable型をswitchMapに返す必要があります。

あなたのコードによれば、switchMapの観測値は元の観測可能な結果とは無関係なので、ここでは単にmapを使用することができます。

ので、最終的な作業コードブロックは、以下のようになります:

pollGet(timer: number = 30000): Observable<any> { 
    return Observable 
       .interval(timer) 
       .map(() => { 
        //return this.http.get('111'); 
        // make sure your r_service.get return an Observable as the example above: http.get 
        return this._service.get(); 
       }) 
       .map(res => res); 
} 
+0

'map'を2回使う理由を説明できますか?私は正しい文脈を得るのに苦労していますが、私が求めているのはポーリングです。ありがとう – Doug

+0

2番目のマップは何もしません。何らかの理由でこの答えがうまくいきません。 – Eeks33

+0

@Doug最初のマップは '_service.get'の新しいストリームを作成し、2番目の' map'は何に基づいていますか'_service.get'から返りたいものです。 2番目のマップで 'response'それを' response.data'または 'response.data.xxx'を返すことができます。 – Pengyy

0

あなたのマップがswitchMap内である必要があります。私はswitchMapが正確な使い方であると信じています。なぜなら、intervalが出る整数ではなく、新しいobservableを返したいからです。あなたがする必要があるのは、HTTP /サービス応答を処理するために地図を添付することです。

pollGet(timer: number = 30000): Observable<GetInterface> { 
    return Observable.interval(timer) 
    .switchMap((intervalCounter) => { 
     return this._service.get() // note that you need a return here, or inline return 
     .map(res => res); 
    }) 
    .subscribe(res => { 
     console.log('testing'); 
    }) 
} 
関連する問題