2017-05-05 28 views
0

我必須爲我的angular2應用程序進行多個http調用。我首先必須進行一個呼叫,等待響應,從中檢索下一個呼叫的URL並進行後續呼叫。同樣,我的第三個電話是基於第二個電話的回覆。我必須執行這個操作,直到http呼叫的響應沒有下一個呼叫的URL。這裏的問題是,我無法知道我打算做多少個呼叫(它完全依賴於當前的響應,如果它有下一個呼叫的鏈接)。另外我需要整合來自所有呼叫的響應。根據Angular2中的先前響應進行多個http調用

這是每個調用的響應。

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

我不得不提取下一頁屬性的值,使HTTP調用,直到我得到的地方下一頁屬性爲null,像下面的響應。

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

這是我用來打一個電話的代碼。我不知道如何連接這些電話。

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

在第二,第三等...將網址設置爲nextPage href? – mast3rd3mon

+0

您可以使用遞歸,但您甚至不需要並且可以並行執行所有調用(第一個除外):由於總大小(3000)和頁面大小(500),您知道應該有6頁。 –

回答

0

我不知道這是否是最好的解決方案。但是,想到什麼東西遞歸如@ mast3rd3mon建議:

調用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

使用遞歸。這是一個例子。它將執行順序並累積結果直至滿足條件。

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

相關問題