【发布时间】:2019-12-09 22:37:46
【问题描述】:
我是 Angular 新手,我正在过滤 ID 与 JWT 有效负载中相同的用户。
我可以在 Observable 的 subscribe() 中这样做:
this.route.data.subscribe((data) => {
this.users = data.users.filter((u: User) => u.id !== +this.authService.decodedToken.nameid);
});
我也可以在 pipe() 方法中这样做:
this.route.data
.pipe(map(data => data.users.filter((u: User) => u.id !== +this.authService.decodedToken.nameid)))
.subscribe((data) => {
this.users = data;
});
解析器代码(可能与问题无关):
resolve(route: ActivatedRouteSnapshot): Observable<User[]> {
return this.userService.getUsers().pipe(
catchError(error => {
this.alertify.error('Problem retrieving data');
this.router.navigate(['/home']);
return of(null);
})
);
}
现在我为什么要使用 pipe() 方法而不是直接在 subscribe() 方法中进行过滤,在这种情况下使用 pipe() 有什么优点或缺点?两者中哪一个是传统的 Angular 方式?
我认为 pipe() 会慢一点,因为它首先映射然后过滤。
【问题讨论】:
-
在这种情况下,没有任何区别。但是,如果您想通过将此过滤移动到提供数据的服务或解析器中来简化组件的代码,该怎么办?除了使用 pipe() 之外,您别无选择。
-
性能应该可以忽略不计。假设您有多个订阅者,您要在每个订阅中进行过滤吗?但正如@JBNizet 所说,你的例子太简单了,看不出区别。你不应该忘记取消订阅(或使用 takeUntil/first 管道)。
-
@s.alem 从 ActivatedRoute observables 退订是没有用的。
-
@JBNizet 你是对的。我学到了一些新东西。谢谢。 stackoverflow.com/a/41359138/1784230
标签: angular rxjs observable rxjs6 rxjs-pipeable-operators