angular - 平面图内的 rxjs 条件

标签 angular rxjs

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

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 无法扩展。

我考虑过过滤器或 takeWhile 运算符,但我无法执行重定向。

我还考虑过返回 Observable.of 而不是抛出(在第 4 行),但随后我必须在 subscribe 中执行 if 操作,这也很糟糕。

最佳答案

您可以执行this.router.navigatereturn Observable.empty()里面.flatMap 。这样你就会有一个 if声明。

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

但通常Observables 应该是惰性且纯粹的(没有副作用),这将使它们可预测且易于组合。副作用只能由订阅者执行。

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

关于angular - 平面图内的 rxjs 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47610150/

相关文章:

html - 动态设置ionic2组件的Style属性

javascript - Angular2 RxJS 得到 'Observable_1.Observable.fromEvent is not a function' 错误

javascript - 将 React useEffect 钩子(Hook)与 rxjs mergeMap 运算符一起使用

angular - 从可观察数组获取最新的订阅响应 - Angular 7

javascript - RxJS 的开关函数

angular - typescript /Angular 2 : rxjs errors TS1138, TS1005、TS1128

Angular 5 : clicked button that triggers a dialog becomes highlighted after the dialog is closed

angular - 使用 ngx-bootstrap 的 Bootstrap 下拉菜单

angular - 如何在 RxJS 中使用 await

angular - 在 Angular 2 中更改 url 而不重定向