2017-04-18 24 views
0

我必須從Angular2應用程序調用三個Web服務,並且我必須鏈接它們。他們都可以一起調用,所以我使用forkJoin。但後來,我必須使用從其中一個服務返回的ID來調用另一個服務。 用forkJoin的結果來鏈最後一個服務的正確方法是什麼?Angular中的RxJs5:鏈接不轉換數據的Observable的正確方法是什麼?

儘管我可以使用flatMap,但這最後一個服務並沒有對forkJoin中的內容進行轉換(map和flatMap被稱爲轉換運算符,只能在我們將返回的數據轉換爲某些東西時使用它們其他)。

我應該訂閱forkJoin,然後在成功的情況下再次訂閱最後一個服務(我不喜歡它)?或者我應該使用Zip(或ZipAll)運算符? 非常感謝您提前。

編輯:我會提供一個例子。 讓說我必須得到一些項目的信息,我有三個服務:

  1. getProject(projectId):獲得有關項目的信息,如它的標題,持續時間......和一些特性則項目的projectPropertiesId可以有。

  2. getProperties():獲取比任何項目都可以擁有的所有屬性列表。

  3. getProjectProperties(propertiesId):獲取所選屬性的列表。 一種解決方案可能是:

this.subscriber1 = Observable.forkJoin(this.projectService.getProject(projectId), this.projectService.getProperties()) 
.subscribe(data => { 
    this.project = data[0]; 
    this.properties = data[1]; 
    this.subscriber2 = 
    this.projectService.getProperties(this.project.propertiesId) 
    .subscribe(selectedProperties => { 
     // save the selected properties... 
    } 
}); 

應該不是更好,你有forkJoin後,使用郵編運算符鏈的最後一個服務調用(projectService.getProperties),而不是有內另一個用戶訂戶?

+1

歡迎來到堆棧溢出,不幸的是,現在的答案是:這取決於。也許你可以添加一些代碼,告訴我們你做了什麼。這將是更容易弄清楚你想達到什麼。 – n00dl3

+0

_「我必須打電話給三個網絡服務」_與_「他們兩個」_3或2? _「我必須鏈接他們」_與_「我使用forkJoin」_鏈或叉?一個例子會很有用。 – zeroflagL

+0

我用一個例子編輯了這個問題... –

回答

0

一般不建議嵌套subscriptions,你應該保持一切在single stream。我沒有完全明白你的例子,但我認爲你所要求的是並行調用兩個服務,一旦它們都返回,然後用第一個服務調用的結果調用第三個服務。

你可以這樣做,假設兩個初始服務的可觀察性都完成了。 forkJoin等待兩者完成。

this.subscription = Observable 
    .forkJoin([this.projectService.getProject(projectId), this.projectService.getProperties()]) 
    .switchMap(([project, properties]) => this.projectService.getProjectProperties(project.somevalue, properties.somevalue)) 
    .subscribe(data => { 
     // save the selected properties... 
    }); 
+0

謝謝你的回答。你爲什麼選擇'switchMap'而不是'zip'? –

+0

我沒有看到需要將2個初始調用的結果組合到流中,您只需要它們作爲調用第三個調用的參數。 – Thibs

相關問題