2016-11-07 115 views
5

我希望創建一個函數,該函數返回Observable<any>,但在返回另一個異步任務必須完成之前(Observable<string>),以便將值傳遞給返回的ObservableAngular 2 rxjs嵌套Observables

@Injectable() 
export class MyComponent 
{ 

     GetAuthToken = function() : Observable<string> 
     { 
      return this._storageService.GetAsString('authToken'); 
     } 

     GetData = function(authToken) : Observable<any> 
     { 

      let headers = new Headers(); 
      headers.append('authToken', authToken); 
      var getUsers = this._http.get('/api/endpoint', { headers: headers }) 
       .map((resonse: Response) => resonse.json())); 

      return getUsers;   
     } 


     DoIt = function() : Observable<any> 
     { 
      this.GetAuthToken().Subsribe(t=> { 
       return GetData(t); 
      }) 
     }   


} 

因此,而不是傳遞的authToken參數到的GetData功能的,我希望在的GetData函數中執行GetAuthToken功能,等待它完成,然後仍返回HTTP觀測。

執行的DOIT函數將返回用戶,而不是的GetData可觀察

+2

完全無關的問題:爲什麼你使用語法:'GetAuthToken = function(){...}'而不是'GetAuthToken(){...}'像其他人一樣(我知道這兩個方法定義是儘管如此)? – martin

+1

使用'Observable.forkJoin',勾選這個:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md –

+0

@Martin http://stackoverflow.com/questions/336859/javascript-function-declaration-syntax-var -fn-function-vs-function -fn – gunwin

回答

6

嘗試使用concatMap()

DoIt() : Observable<any> 
{ 
    return this.GetAuthToken() 
     .concatMap(token => this.GetData(token)); 
} 
+0

完美。這工作。我的WebAPI服務沒有運行,這導致了我的空問題。謝謝! – gunwin

+0

類似的問題 - concatMap()的作品完美!謝謝。 – Reinhard

0

這也可以使用flatMap

DoIt() : Observable<any> 
{ 
    return this.GetAuthToken() 
     .flatMap(token => this.GetData(token)); 
}