2016-11-07 37 views
5

Tôi muốn tạo hàm trả về Observable<any> nhưng trước khi trả lại tác vụ không đồng bộ khác phải hoàn thành (Observable<string>), để giá trị được chuyển đến số Observable trả lại.Góc 2 rxjs lồng nhau Quan sát

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


} 

Vì vậy, thay vì đi qua các tham số authToken vào chức năng GetData, tôi muốn thực hiện chức năng GetAuthToken bên trong hàm GetData, chờ đợi để hoàn thành nó, và sau đó vẫn trả lại http thể quan sát được.

Thực thi các hàm DoIt sẽ trở về thuê bao, không phải là GetData Quan sát

+2

câu hỏi hoàn toàn không liên quan: Tại sao bạn sử dụng cú pháp: 'GetAuthToken = function() {...}' và không phải 'GetAuthToken() {...}' giống như mọi người khác (tôi biết hai định nghĩa phương thức này mặc dù không giống nhau)? – martin

+1

Sử dụng 'Observable.forkJoin', kiểm tra điều này: 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

Trả lời

6

Hãy thử sử dụng concatMap():

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

Hoàn hảo. Những công việc này. Dịch vụ WebAPI của tôi không chạy, điều này đã gây ra vấn đề về null của tôi. Cảm ơn bạn! – gunwin

+0

vấn đề tương tự - concatMap() hoạt động hoàn hảo! Cảm ơn bạn. – Reinhard

0

này cũng có thể sử dụng flatMap

DoIt() : Observable<any> 
{ 
    return this.GetAuthToken() 
     .flatMap(token => this.GetData(token)); 
} 
Các vấn đề liên quan