2017-05-03 40 views
0

所以我的問題是,我需要請求大量的測量。而我使用的API只返回最多2000個對象,響應正文中的下一個對象的url。如何將HTTP調用與前一個HTTP調用的響應正文中的下一個URL進行鏈接?

這可能是一個有點混亂,所以我在這裏的第一個請求的例子:

getMeasurements(id: string, dateTo: string) { 
    return this.http.get(`${API}/measurements?id=${id}&dateTo=${dateTo}&pageSize=2000`) 
     .map((response: Response) => { 
      let body = response.json(); 
      // here I return an array containing 2000 objects 
      return body.measurements; 
     }) 
} 

然而,身體的對象在這裏還包含了屬性「下一個」,這對接下來的2000個對象中的URL 。

那麼,如何獲得下一個請求:

this.http.get(body.next) 
    .map((response: Response) => { 
    let body = response.json(); 
    return body.measurements; 
    }) 

與第一請求鏈接。考慮到下一個請求體中可能會有另一個「下一個」網址,我該如何做到這一點?

+0

什麼是終止條件? – Meir

回答

0

的解決方案是使用擴展:

getMeasurements(id: string, dateFrom: Date, dateTo: Date) { 
    const get = (url: string, measurements?: any[]) => this.http.get(url).map((response: Response) => response.json()); 

    return get(`${API}/measurements?source=${id}&dateFrom=${dateFrom}&dateTo=${dateTo}`, []) 
     .expand(body => { 
      return body.next ? get(body.next) : Observable.empty() 
     }) 
     .map(body => body.measurements); 
} 
0

我可以給你一個邏輯怎麼辦呢

1日創建一個函數,你就要求

function a(url) { 
    this.http.get(url) 
    .map((response: Response) => { 
     let body = response.json(); 

     if (body.next != "") { 
     a(body.next); 
     } 
     // here use your an array containing 2000 objects 
    }) 
} 
// Call Your function 
a('${API}/measurements?id=${id}&dateTo=${dateTo}&pageSize=2000'); 
+0

我不認爲這會連接結果。你不返回一個Observable,所以第一個請求不會爲第二個請求。那麼第二個請求的結果會不會丟失? – Velter

+0

那麼如果你想創建一個函數,它提供了動態的結果比你要創建一個同步請求,並不斷循環,直到body.next爲null,比給結果。 –

+0

請研究[降價求助](https://stackoverflow.com/editing-help) – mplungjan

0

試着這麼做

getMeasurements(id: string, dateTo: string) { 
    const get = (url: string) => this.http.get(url).map(response => { 
    const body = response.json(); 
    const nextUrl = body.next; 

    return nextUrl 
     ? Observable.of(body.measurements).concat(get(nextUrl)) 
     : Observable.of(body.measurements); 
    }); 

    return get(`${API}/measurements?id=${id}&dateTo=${dateTo}&pageSize=2000`) 
    .mergeAll(); 
} 

注意我沒有測試過這個。

+1

我覺得這正好在正確的方向。然而,我只是測試了這一點,我的訂閱功能只被調用兩次;第一次與第一次2000年的對象,第二次我得到了Observable回來... – Velter

+0

有趣。我將需要玩它。 –

相關問題