2017-05-05 7 views
0

私のangular2アプリケーションで複数のhttp呼び出しを行う必要があります。私は最初に1つの呼び出しを行い、応答を待ってから、次の呼び出しのURLを取得して、それ以降の呼び出しを行う必要があります。同様に、私の第3の呼び出しは、第2の呼び出しの応答に基づいています。 http呼び出しの応答が次の呼び出しにURLを持たないまで、この操作を実行する必要があります。ここで問題となるのは、私は何通の通話を行うかを知る方法がない(次の通話へのリンクがあれば、現在の応答のみに依存する)。また、私はすべての呼び出しからの応答を統合する必要があります。Angular2の以前の応答に基づいて複数のhttp呼び出しを行います。

ここに、各呼び出しの応答があります。

{ 
    "data": { 
    "page": 5, 
    "pageSize": 500, 
    "totalSize": 3000, 
    "entries": [], 
    "nextPage": { 
     "href": "http://someurl? 
     requestParam=someValue&page=1&pageSize=500", 
     "rel": null 
    } 
    } 
} 

nextPage属性から値を抽出し、次の属性がnullの応答が得られるまでhttp呼び出しを行う必要があります。

{ 
    "data": { 
    "page": 5, 
    "pageSize": 500, 
    "totalSize": 3000, 
    "entries": [], 
    "nextPage": null 
    } 
} 

ここでは、1回の呼び出しで使用するコードを示します。私はどのように これらの呼び出しをチェーンするか分からない。

private load(extraUrlParam?: any) { 
    let me = this; 
    let url = me.getUrl(type, extraUrlParam, null); 

    me.pHttp.get(url, this.getHttpOptions()) 
     .map((response: Response) => response.json()) 
     .subscribe(
     data => { 
      console.log("data received"); 
      me.data = this.preProcessData(data); 
      me.dataSubject.next(this.data); 
     }, 
     error => { 
      this.dataSubject.error(error); 
      me.handleError(error, url, type); 
     }); 

    } 

ご意見をいただければ幸いです。

+0

2番目、3番目など... urlを次のページのhrefに設定しますか? – mast3rd3mon

+0

あなたは再帰を使うことができますが、必要なことはしませんし、(最初のものを除く)すべての呼び出しを並行して行うことができます:合計サイズ(3000)とページサイズ(500) 6ページが必要です。 –

答えて

0

これが最善の解決策であるかどうかわかりません。

コールloaddataの()

private url:string; 

private loadData(extraUrlParam?: any){ 
    let me = this; 
    this.url = me.getUrl(type, extraUrlParam, null); 

    this.load(extraUrlParam); 
} 
private load(extraUrlParam?: any) { 
    let me = this; 

    me.pHttp.get(url, this.getHttpOptions()) 
     .map((response: Response) => response.json()) 
     .subscribe(
     data => { 
      console.log("data received"); 
      me.data = this.preProcessData(data); 
      me.dataSubject.next(this.data); 

      // CHANGE THE URL HERE 
      me.url = RECIEVED_URL; 
      me.load(extraUrlParam); 
     }, 
     error => { 
      this.dataSubject.error(error); 
      me.handleError(error, url, type); 
     }); 

    } 
0

使用再帰一度:しかし、何が頭に浮かぶことを示唆@ mast3rd3monのようなものが再帰的です。ここに例があります。シーケンスが実行され、条件が満たされるまで結果が累積されます。

function getNext(acc, res) { 
    return res < 10 ? 
     Rx.Observable.of({acc: acc + ':' + (res+1), val: res+1}) 
     .switchMap(({acc, val}) => getNext(acc, val)) : 
     Rx.Observable.of({acc:acc, val: 'done'}); 
    } 

    Rx.Observable.of(0) 
    .switchMap(x => getNext(x, x)) 
    .subscribe(({acc}) => console.log('result:', acc)) 
+0

コメントありがとうございます。私は@ mast3rd3monによって提案された再帰を試み、それは働いた。 – James

関連する問題