2016-11-07 35 views
5

Observable<any> döndüren bir işlev oluşturmak istiyorum, ancak döndürülen Observable için bir değerin geçirilmesi için başka bir asenkron görev döndürmeden önce tamamlanmalıdır (bir Observable<string>).Açısal 2 rxjs yuvalanmış Gözlemler

@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); 
      }) 
     }   


} 

Bunun yerine GetData işleve Kimlik Doğrulama Simgesi parametresini geçme, ben GetData işlev içinde GetAuthToken işlevini yürütmek isteyen, tamamlanmasını bekleyin ve sonra yine gözlemlenebilir http dönün. Değil, GetData gözlemlenebilir aboneyi dönecekti DoIt fonksiyon komutunun

+2

Tamamen alakasız bir soru kullanılarak da mümkündür: Neden sen sözdizimini kullanıyorsunuz: 'GetAuthToken = function() {...}' ve 'GetAuthToken() {...}' gibi herkes gibi (Bu iki yöntem tanımını biliyorum. aynı olsa da)? – martin

+1

Use Observable.forkJoin', şunu kontrol edin: 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

cevap

6

concatMap() kullanmayı deneyin:

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

Mükemmel. Bu çalışıyor. WebAPI hizmetim çalışmıyordu, bu da null problemime neden oldu. Teşekkür ederim! – gunwin

+0

benzer bir sorun - concatMap() mükemmel çalışıyor! Teşekkür ederim. – Reinhard

0

Bu flatMap

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