2016-08-30 7 views
0

私の最初の質問はここにあります!私が行うアプリに取り組んでいる は、次のようにAPIと通信間隔のあるRxJSオブザーバブルの連鎖

STEP1:が要求ペイロードを追加し、要求のオプションを作成 - > APIへのPOSTリクエストが

APIは、リクエストIDを応答

ステップ2:更新要求オプション、ペイロードとして要求IDを送信する - >ポスト要求APIに

最終応答:response.json

最終的な応答には、要求されたデータに応じて少し時間がかかることがあります。 これは平均して4〜20秒の間のどこからでもかかります。

observablesを使用してこれらのリクエストをチェーンするにはどうすればよいですか?switchmapを使ってみましたが失敗しましたが(下のように)、どのように間隔を追加するのですか? ポーリングは4秒ごとに行われ、レスポンスの解除は実行可能な解決策ですか?どのようにこれは上記の文脈で行われますか?

EDIT1: 最終目標:私は、角度や学習の観測に新たなんだ、と私は前方の最良の方法であるかを理解しているよ...この文脈において観察助けを連鎖するのでしょうか?すなわち、最初の応答の後に何らかの種類の間隔があり、flatMap を使用するか、または間隔のあるポーリングを使用してレポートが準備完了であるかどうかを確認します。ここで

は私が持っているものだ、これまで

輸出クラスreportDataService { コンストラクタ(プライベート_HTTP:HTTP){}私のコンポーネントで

headers: Headers; 
requestoptions: RequestOptions; 
payload: any; 
currentMethod: string; 


theCommonBits() { 
    //create the post request options 
    // headers, username, endpoint 
    this.requestoptions = new RequestOptions({ 
     method: RequestMethod.Post, 
     url: url, 
     headers: newheaders, 
     body: JSON.stringify(this.payload) 
    }) 
    return this.requestoptions; 
} 
// report data service 
reportService(payload: any, method: string): Observable<any> { 
    this.payload = payload; 
    this.currentMethod = method; 
    this.theCommonBits(); 
    // fetch data 
    return this._http.request(new Request(this.requestoptions)) 
     .map(this.extractData) 
     .catch(this.handleError); 
} 

private extractData(res: Response) { 
    let body = res.json(); 
    return body || {}; 
} 

private handleError(error: any) { 
     let errMsg = (error.message) ? error.message : 
     error.status ? `${error.status} - ${error.statusText}` : 'Server error'; 
    console.error(errMsg); // log to console instead 
    return Observable.throw(errMsg); 
} 

どう使用について

fetchData() { 
    this._reportService.reportService(this.payload, this.Method) 
      .switchMap(reportid => { 
      return this._reportService.reportService(reportid, this.newMethod) 
     }).subscribe(
     data => { 
      this.finalData = data; 
      console.info('observable', this.finalData) 
     }, 
     error => { 
      //console.error("Error fetcing data!"); 
      return Observable.throw(error); 
     } 
     ); 
} 
+0

あなたの質問は私にはかなり不明瞭です。あなたは何を達成しようとしていますか?あなたは2つのAPI呼び出しを連鎖させるだけでいいですか、それとも定期的に行う必要がありますか? –

+0

お時間をありがとう!私は私の最終目標を追加しました。私は最善の方法を把握しようとしています。これを達成するためにチェーンを使うか、他のアプローチをしています。私は新しいリクエストごとにこのサービスを呼び出さなければなりません – anilZ

答えて

0

Observableの代わりにあなたのサービスを約束し、コンポーネントの.then()メソッド。あなたはそれらの間のアクションをリンクしたいと思うように.then()リンクすることができます。

+0

こんにちは!私は角度2で約束を使用しようとしていませんでしたが、私は第2 api呼び出しの前に8秒間待つことになる角度1で使用されるsetTimeout関数を持っていました(しかし時々、これはペイロードが複雑だった場合に失敗します)。オブザーバーがより良い方法であるかどうか疑問に思っていた – anilZ

+0

2番目のAPIが最初に応答した後に呼び出されますか?その場合は、サービスへの呼び出しで.then()関数を使用できます。 –

+0

しかし、特定の時間が経過した後にアクションを実行したい場合は、{Observable}を 'rxjs/Rx'からインポートしてください。 Observable.timer(8000)(このタイマーを購読する必要があります) –

関連する問題