angular - 如何过滤activatedRoute.queryParams并根据过滤器订阅不同的observables

标签 angular rxjs5

问题:我的应用可能会收到查询字符串参数,并且根据查询字符串中的参数需要执行不同的操作:

1) 在这里,我在查询字符串中查找广告商,如果存在,我需要订阅一项将验证广告商的服务:

this.activatedRoute.queryParams
  .filter(data => data.hasOwnProperty('advertiser'))
  .mergeMap(v => {
    advertiserId = v.advertiser;
    return this.myService.advertiserCheck(v.advertiser);
  })
  .subscribe(data => {
    if (true === data.valid) {
      // some processing takes place
    }
  });

2)这里我寻找orderKey参数:

this.activatedRoute.queryParams
  .filter(data => data.hasOwnProperty('orderKey'))
  .mergeMap(() => this.activatedRoute.firstChild.firstChild.url)
  .subscribe(segments => {
    // some processing takes place with the url segments
  });

如您所见,我订阅了 ActivatedRoute.queryParams 两次。有什么办法可以将两者结合起来吗?我尝试了以下方法:

this.activatedRoute.queryParams
  .filter(data => data.hasOwnProperty('advertiser') || data.hasOwnProperty('orderKey'))
  .mergeMap(v => {
    if (v.hasOwnProperty('advertiser')) {
      advertiserId = v.advertiser;
      return this.myService.advertiserCheck(v.advertiser);
    } else {
      return this.activatedRoute.firstChild.firstChild.url;
    }
  })
  .subscribe(data => {
    console.log('which one am I handling?');
});

这些参数不会同时出现在查询字符串中,但在订阅中我不知道我正在处理哪一个。我想我可以创建一个变量,然后在订阅内检查它,但它看起来不太优雅。有没有更好的办法?我应该保持原样,这样就不那么困惑了吗?

最佳答案

我会将它们保留为两个独立的序列,因为它们有不同的最终结果。但我也会让它们与 shareReplay 共享相同的底层可观察序列。运算符。

ngOnInit(){
    this.obs$ = this.activatedRoute.queryParams
        .shareReplay();

    // sequence 1
    this.obs$
        .filter(data => data.hasOwnProperty('advertiser'))
        .mergeMap(v => {
            advertiserId = v.advertiser;
            return this.myService.advertiserCheck(v.advertiser);
        })
        .subscribe(data => {//process});

    // sequence 2
    this.obs$
        .filter(data => data.hasOwnProperty('orderKey'))
        .mergeMap(() => this.activatedRoute.firstChild.firstChild.url)
        .subscribe(segments => {//process});
}

关于angular - 如何过滤activatedRoute.queryParams并根据过滤器订阅不同的observables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47226685/

相关文章:

javascript - Angular Material,Md-datepicker - 在输入点击时打开日期选择器

css - 在 Ionic 4 输入表单中,如何更改日期文本的输入颜色?

http - Angular2 可观察的

redux - 有条件地获取史诗中的数据

javascript - 通过链接包装 Rx JS Observable

Angular 4 RXJS Observable .interval() 无法在后台工作

Angular CLI - 如何在 src 文件夹之外获取 .spec.ts 文件?

angular - 当 ChangeDetectorRef 分离时更新 AsyncPipe

angular - RxJS5 随着时间的推移发出数组项并永远重复

javascript - 为什么我要使用 RxJS interval() 或 timer() 轮询而不是 window.setInterval()?