如何使用RxJS做这个工作

时间:2017-04-20 18:50:12

标签: angular typescript rxjs rxjs5

大家, 我正在学习Web App程序使用Angular 2,我希望实现一个服务。

这样的服务:

@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工具非常感兴趣。

感谢。

1 个答案:

答案 0 :(得分: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 => { ... });

或者您可以创建一个返回Observable并自行调用的递归函数:

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