2017-06-12 22 views
0

我有angular2項目並在我有這個類:如何正確使用觀測數據,修改這個數據與其他觀察到的,它返回的可觀測

class Application { 
    id: number; 
    last_android_releasse_url: string; 
    last_android_releasse: Release; 
    last_ios_releasse_url: string; 
    last_ios_releasse: Release; 
} 

我取的所有應用程序,並加載它們|異步管道是這樣的:

this.asyncApps = this.appService.getAll(this.params) 
     .do((data: any) => { 
     this.count = data.count; 
     }).map(data => { 
     return data.apps; 
     }); 

我需要的是加載每個發行對象爲data.apps內每一個應用程序,並返回觀察到的asyncApps與異步管工作。我不確定如何問我的問題,所以我接受標題更改的提案。 所以最終代碼應該做這樣的事情:

this.asyncApps = this.appService.getAll(this.params) 
     .do((data: any) => { 
     this.count = data.count; 
     }).map(data => { 
     for (let app of data.apps) { 
      this.http.get(app.last_android_releasse_url).subscribe(
      release_data => { 
       app.last_android_releasse = release_data.json().last_android_releasse; 
      }, 
      error => this.alertService.showError(error.etext) 
     ); 
      this.http.get(app.last_ios_releasse_url).subscribe(
      release_data => { 
       app.last_ios_releasse = release_data.json().last_ios_releasse; 
      }, 
      error => this.alertService.showError(error.etext) 
     ); 
     } 
     return data.apps; 
     }); 

這一個工作,但我在想的東西用flatMap或forkJoin。對我來說,這似乎不是正確的解決方案。請你幫我清楚一點。

回答

1

你是對的,你可以使用flatMap。感謝提問,這是我的嘗試。

this.asyncApps = this.appService.getAll(this.params) 
     .do((data: any) => { 
     this.count = data.count; 
     }) 
     .flatMap(data => Observable.from(data.apps)) 
     .flatMap(app => Observable.forkJoin(
      this.http.get(app.last_android_releasse_url).map(d => d.json().last_android_releasse), 
      this.http.get(app.last_ios_releasse_url).map(d=>d.json().last_ios_releasse)) 
      .first() 
      .map(res => Object.assign(app, { 
        last_android_releasse : res[0], 
        last_ios_releasse : res[1]}) 
      ) 
    ); 

讓我知道它的工作。


這裏是我做過什麼

this.asyncApps = this.appService.getAll(this.params) 

進行網絡通話

  .do((data: any) => { 
      this.count = data.count; 
      }) 

更新計數結果的號碼列表以流的個人

  .flatMap(data => Observable.from(data.apps)) 

轉換流項目

  .flatMap(app => Observable.forkJoin(

對於每個應用程序,我都會轉換應用程序而不響應應用程序和響應數據。作爲它的異步和需要Observable,使用flatMap。

   this.http.get(app.last_android_releasse_url).map(d => d.json().last_android_releasse), 
       this.http.get(app.last_ios_releasse_url).map(d=>d.json().last_ios_releasse)) 

做並行單獨的呼叫,並將結果在陣列

   .first() 

流結合獲得的第一個結果

   .map(res => Object.assign(app, { 
         last_android_releasse : res[0], 
         last_ios_releasse : res[1]}) 
       ) 

轉換的結果與結果到App

  ); 

F最後,我們應該在每個應用中都有一組響應應用。

+0

是的。這個答案幫了我很多。唯一的問題是最後應該返回數組(或異步),所以我添加了.toArray()。我也嘗試使用scan()。我希望在添加應用程序版本後立即返回結果,而不必等待所有其他應用程序版本的返回,但掃描會返回無序的結果。另外我不明白爲什麼我們需要使用.first(),因爲這個observable只返回一個結果。因此,使用.toArray()可以工作,但隨後出現問題,即如果返回所有應用程序及其版本,則加載該頁面。謝謝你的答案。 – makkasi

+0

如果沒有.toArray()或.scan(),則編譯時錯誤爲:類型'Observable '不可分配爲鍵入'Observable '。所以似乎可觀察者一次返回一個應用程序。 – makkasi

相關問題