Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 8-在订阅之前进行筛选,如果筛选器返回null,是否会触发它?_Angular_Observable - Fatal编程技术网

Angular 8-在订阅之前进行筛选,如果筛选器返回null,是否会触发它?

Angular 8-在订阅之前进行筛选,如果筛选器返回null,是否会触发它?,angular,observable,Angular,Observable,我在继续一个前同事的项目,他用一种我从未见过的方式编码了一些东西,有人能帮我理解背后的原因吗 this.loginState.User .pipe(filter(u => !!u)) // what on earth is this .subscribe(u => { if (!u.isAuthenticated && !u.hasLocalPassword ..... 因此,基本上这个代码块检查是否有活动用户登录,但是我

我在继续一个前同事的项目,他用一种我从未见过的方式编码了一些东西,有人能帮我理解背后的原因吗

this.loginState.User
      .pipe(filter(u => !!u))   // what on earth is this
      .subscribe(u => {
        if (!u.isAuthenticated && !u.hasLocalPassword .....
因此,基本上这个代码块检查是否有活动用户登录,但是我不清楚
过滤器(u=>!!u)
。 对我来说,这等于:

 this.loginState.User
          .subscribe(u => {
             if (u) {
               if (!u.isAuthenticated && !u.hasLocalPassword .....
             }
基本上是将我的代码包装在订阅后的
if(u)
中。 我错了吗?这是不一样的,用过滤器这样做实际上有好处吗


谢谢

正如评论中已经提到的,将条件放入
过滤器
应该(并且在您的情况下是)相当于将该逻辑放入subscribe中


习惯使用操作符是一个非常好的主意。除非必要,否则您的目标应该停止使用订阅(改为在模板中使用)

如果您需要订阅,那么尝试在没有逻辑的情况下实现订阅。这意味着将每个操作放在pipable操作符中,并以声明方式声明正在进行的操作

无逻辑订阅的一个例子是:

//myObs$:可观察;
myObs$.pipe(
过滤器(值=>values.length>0),
map(values=>values.map(val=>val*2)),
点击(值=>doSomeSideEffect(值)),
).subscribe();

您的版本完全相同。
过滤器
操作符阻止值继续通过可观察管道。我想说这两个版本都很好,你更喜欢哪一个取决于你的喜好。在代码库中以相同的方式使用
过滤器
,将使代码具有一定的一致性,并且更易于阅读。它还与其他管道操作符很好地集成。我个人觉得
if(u)
有点难看,我更喜欢这里的
过滤器,但在你的例子中,两者在功能上是等效的。好的,现在更清楚了,我将继续使用过滤器,然后习惯这种语法!