如何根据rxjs中现有的observable创建一个新的可观察订阅?

时间:2017-06-08 16:11:55

标签: javascript angular rxjs

我需要在我的项目中执行以下操作(来自 https://github.com/devyumao/angular2-busy

ngOnInit() {
    this.busy = this.http.get('...').subscribe();
}

在我的项目中,我根据路线变化提出以下要求:

ngOnInit(): void {   
    this.activatedRoute
        .params
        .map(params => params['queryString'])
        .flatMap(id => this.http.(''))
        .subscribe(result => this.data = result);   
}

似乎每次路线发生变化时我都需要创建一个新的订阅。我不知道该怎么做。

我正在寻找rxjs解决方案(不使用Promise)。

谢谢!

德里克

2 个答案:

答案 0 :(得分:4)

我会全局(在您的主要组件中)以这种方式注册路由更改并在相关的回调中触发您的请求:

this.router.events
  .filter(event => event instanceof NavigationStart)
  // or NavigationEnd
  .subscribe(event => {
    this.http.post('').subscribe();
  });

这样您就可以订阅一次更改。

如果您想要访问路由参数,您还需要注入ActivateRoute实例并订阅其params属性。

为此,我会利用combineLatest类的Observable方法,如下所述:

export class AppComponent {

  constructor(private router: Router, private route: ActivatedRoute) {
    Observable.combineLatest(
      this.router.events
        .filter(event => event instanceof NavigationStart),
      this.route.params
    )
    .subscribe(data => {
      const event = data[0];
      const params = data[1];
      (...)
    });
  }
}

别忘了添加:

import 'rxjs/add/observable/combineLatest';

答案 1 :(得分:2)

实际上,您可以订阅链中的ajaxCallObservable。 :)



ngOnInit(): void {   
    this.activatedRoute
        .params
        .map(params => params['queryString'])
        .map(id => this.http.(''))
        .do(ajaxCallObservable => { this.busy = ajaxCallObservable.subscribe() })
        .flatMap(ajaxCallObservable => ajaxCallObservable)
        .subscribe(result => this.data = result);   
}