我正在从一个前同事那里继续一个项目,他以一种我从未见过的方式编写了一些代码,有人可以帮我理解其背后的原因吗?
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)
中的订阅之后。
我是错的,那是不一样的,使用过滤器这样做实际上有好处吗?
谢谢
答案 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();