javascript - 如何基于 rxjs 中现有的 observable 创建一个新的 observable 订阅?

标签 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)。

谢谢!

德克

最佳答案

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

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

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

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

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

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';

关于javascript - 如何基于 rxjs 中现有的 observable 创建一个新的 observable 订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44440765/

相关文章:

javascript - 基于对象值的火灾事件

javascript - HTML Canvas 在调整大小时以适合带有 'offsetWidth' 的父 Div 时无法正确显示

javascript - 数据表(行详细信息): Uncaught TypeError: Cannot read property 'style' of undefined

angular - Angular 中 i18n 翻译文件的更新

javascript - RXJS:第一次拖动后捕获拖动事件不起作用

javascript - 将 Javascript 注入(inject) Chrome 扩展中新创建的选项卡

angular - API调用后如何重定向

angular - Angular 中的路由组件应该有选择器吗?

javascript - RxJs 在出错时调用 observable 并重复步骤

rxjs - 如何取消来自许多角度 8 的待处理 http 请求之一