平面图中的rxjs条件

时间:2017-12-02 16:44:58

标签: angular rxjs

我想在flatMap中有一个条件来检查第一个observable返回的内容。如果条件不满足,我想打破并导航到不同的页面。

this.service.getData(id)
  .flatMap((data) => {
    if (!data) {
      return Observable.throw(new NoDataFoundError());
    }
    return Observable.forkJoin(
      this.service.getData2(id2),
      this.service.getData3(id3),
    );
  })
  .subscribe(
    ([data2, data3]) => {
      this.data2= data2;
      this.data3= data3;
    },
    (err) => {
      if (err instanceof NoDataFoundError) {
        this.router.navigate(...);
      }
    }
  );   

目前我正在抛出特定的错误并抓住它但是我不喜欢这个解决方案,因为它不是唯一可能引发错误的代码片段而且if不是缩放。< / p>

我考虑过滤器或takeWhile操作员,但我无法执行重定向。

我还考虑过返回Observable.of而不是扔(第4行),但后来我必须在订阅中做if也闻起来。

1 个答案:

答案 0 :(得分:8)

您可以在this.router.navigate内执行return Observable.empty().flatMap。这样您就会有一个if语句。

.flatMap(data => {
  if (!data) {
    this.router.navigate(...);
    return Observable.empty();
  }
  return (...);
})

但通常 Observables应该是懒惰和纯粹的(没有副作用)这将使它们可预测且易于撰写。副作用应仅由订阅者执行。

在您的具体情况下,似乎正确的解决方案是将此逻辑放入路线保护中,如此处所述 - https://stackoverflow.com/a/39162538/3772379

相关问题