2017-02-28 22 views
1

我有一個Angular路由,我通過一個id從我的數據庫加載一個元素。在我的部分我用下面的代碼加載元素:Angular 2路由器參數發出多個http調用

this.route.params 
     .map((params: Params) => params['id']) 
     .switchMap((id: number) => this.service.getElement(id)) 
     .catch((e) => { 
      return Observable.throw(e); 
     }) 
     .subscribe((data: Models.IElement) => { 
      this.element= data as Models.IElement; 
      this.setTitle(); 
     },() => this.router.navigate(['/'])); 

this.service.getElement(id)發出HTTP調用,並返回一個可觀察。一切順利。我現在遇到的問題是我想發出第二個http調用,並且我不知道在哪裏添加第二個服務http調用的代碼(這與getElement類似,接收id作爲參數)。

更多信息:理想情況下,第二次http調用將與getElement調用並行發出。它只取決於Paramsid

如何使用Observables使這項工作成爲可能?有什麼辦法可以使它工作嗎?

+0

你想在哪裏打第二個電話?基於什麼?關於以前的迴應?路由參數ID?請給予更多信息 – Maxime

+0

它只基於id。理想情況下,它將與getElement調用並行發佈。 –

+2

我現在沒有時間給你一個解決方案,但看看[Fork Join](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method -forkJoin),它相當於'Promise.all'。它會訂閱您傳遞的每個觀察對象,然後等待其中每個觀察對象完成後再繼續。當然,它們是並行啓動的。我讓你嘗試一下,如果不成功我會幫助:) – Maxime

回答

1

使用@馬克西姆的評論我來用下面的代碼:

this.route.params 
     .map((params: Params) => params['id']) 
     .switchMap((id: number) => { 
      this.id = id; 
      return Observable.forkJoin([this.service.getElem(id), this.service.getElemDocs(id)]); 
     }) 
     .catch((e) => { 
      return Observable.throw(e); 
     }) 
     .subscribe(([elem, documents]) => { 
      this.elem= elemas Models.IElement; 
      this.elemDocuments = documents; 
      this.setTitle(); 
     },() => this.router.navigate(['/'])); 

這將啓動在同一時間兩個呼叫並等待來自completition。