2017-04-20 31 views
1

everyone, 我正在學習使用Angular 2的Web App程序,並且我想實現一項服務。如何使用RxJS完成這項工作

此服務是這樣的:

@Injectable 
export class MyService { 
    private _data: Any; 
    private _dataReady: boolean = false; 

    getData(): Observable<any> { 

    if (this._dataReady) 
     return Observable.of(this._data); 
    else { 

     http.get('url').subscribe(response=>{ 
      this._data = do_some_calc(response, this._data); 

      if (need_more_data(this._data)) { 
      Recursive http.get('url').... 
      } else { 
      this._dataReady = true; 
      return Observable.of(this._data); 
      } 

     }); 
    } 
    } 

} 

對我來說是困難的部分是,當數據還沒有準備好,需要得到網站的一些數據,並懸掛於新到達的數據信息,可能需要再弄來自網絡的數據。

如何實現這個部分並最終返回客戶端Observalbe?

我知道如何實現這個使用回調函數,但是我非常感興趣的是如何使用RxJS實現。

謝謝。

回答

0

通常你最好鏈的多個concatMap運營商如果請求是互相依賴的:

http.get('url') 
    .concatMap(response => { 
    this._data = do_some_calc(response, this._data); 

    if (need_more_data(this._data)) { 
     return http.get('url') 
     .concatMap(response => { ... }) 
     .concatMap(response => { ... }); 
    } else { 
     this._dataReady = true; 
     return Observable.of(this._data); 
    } 
    }) 
    .subscribe(response => { ... }); 

或者你可以返回一個可觀察並調用自身的遞歸函數:

function recursiveGet(url): Observable { 
    return http.get('url') 
    .concatMap(response => { 
     if (need_more_data(this._data)) { 
     return recursiveGet(url); 
     } else { 
     this._dataReady = true; 
     return Observable.of(this._data); 
     } 
    }); 
} 
相關問題