Angular 8-在订阅之前进行过滤,如果过滤器返回null,会触发它吗?

时间:2020-04-20 09:13:06

标签: angular observable

我正在从一个前同事那里继续一个项目,他以一种我从未见过的方式编写了一些代码,有人可以帮我理解其背后的原因吗?

this.loginState.User
      .pipe(filter(u => !!u))   // what on earth is this
      .subscribe(u => {
        if (!u.isAuthenticated && !u.hasLocalPassword .....

因此,基本上,此代码块检查是否有活动用户登录,但是filter(u => !!u)对我来说并不明确。 对我来说等于:

 this.loginState.User
          .subscribe(u => {
             if (u) {
               if (!u.isAuthenticated && !u.hasLocalPassword .....
             }

基本上将我的代码包装在if (u)中的订阅之后。 我是错的,那是不一样的,使用过滤器这样做实际上有好处吗?

谢谢

1 个答案:

答案 0 :(得分:1)

正如评论中已经提到的那样,将条件放入filter应该(并且在您的情况下)等同于在订阅中包含该逻辑。


习惯使用运算符是一个非常好的主意。除非必要,否则您的目标应停止使用订阅(在模板async pipe 中使用)。

如果需要订阅,请尝试在没有逻辑的情况下实现订阅。这意味着将每个操作放到可操作的运算符中,并以声明性地说明正在发生的方式对其进行组合。

无逻辑订阅的示例为:

// myObs$: Observable<Value[]>;

myObs$.pipe(
  filter(values => values.length > 0),
  map(values => values.map(val => val * 2)),
  tap(values => doSomeSideEffect(values)),
).subscribe();