2016-03-11 78 views
3

我有一個包含驅動程序ID的旅程實體。 我可以使用RESTFull端點獲取訪問,例如/trips/2/使用rxjs將數據添加到http響應中

//example response 
{ 
    id: "2", 
    driver_id: "123" 
} 

我可以使用端點獲取驅動程序細節。例如/drivers/123/, 我最後尊重響應

//expected response from observable 
{ 
    id: "2", 
    driver_id: "123", 
    detailed_driver: { 
    name: "abc", 
    id: "123" 
    } 
} 

目前,我做如下

this.http("/trips/2/").map(data => data.json()).subscribe(trip => { 
    this.http("/drivers/" + trip.driver_id + "/").map(data => data.json()).subscribe(driver => { 
     trip.detailed_driver = driver; 
     this.trip = trip 
    } 
} 

如何使用Rxjs使用這兩個端點得到一個可觀察的最終預期的反應?

+0

你可以添加你當前的提取代碼嗎? – harun

回答

4

你可以使用flatMap操作者和Observable.forkJoin如下所述:

this.http.get('/trips/someid') 
    .map(res => res.json()) 
    .flatMap(res => { 
    return Observable.forkJoin([ 
     Observable.of(res), 
     this.http.get('/drivers/'+res['driver_id']).map(res => res.json()) 
    ]); 
    }) 
    .map(res => { 
    res[0]['detailed_driver'] = res[1]; 
    return res[0] 
    }) 
.subscribe(
    (data) => { 
    } 
); 

flatMap允許在接收到第一個時執行另一個請求。 Observable.forkJoin允許接收第一個響應的響應和第二個響應的結果。

這樣你就可以用第二個更新第一個結果...

+0

這裏有什麼問題http://plnkr.co/edit/opyzLR4ejKdLPGfWM7EN?p=preview點擊'friend tab'並查看'frineds.ts'。我試圖實現你的建議代碼,但沒有工作沒有錯誤。 – micronyks

+0

事實上,我的代碼中有一個錯字:-(fork_oin'末尾的'}'...我更新了我的答案並修復了你的plunkr:http://plnkr.co/edit/BthgxpehFcR6fg9hBRMj? p =預覽感謝您指出@micronyks! –

+0

但是我無法在對象'console.log(data)'中找到所需的數據。能否幫我? – micronyks

相關問題