使用tap()而不是map()RxJS和Angular

使用tap()而不是map()RxJS和Angular,angular,redux,rxjs,observable,rxjs6,Angular,Redux,Rxjs,Observable,Rxjs6,我有一个登录保护,基本上检查用户是否登录。如果他已登录,它将跳过登录并转到主页。我写了这段代码,它很有效: canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot){ 返回此.store.select(fromApp.isAuthenticated) .管道(取(1), 映射(已验证=>{ 如果(未经验证){ this.router.navigate(['/home']); 返回false; }否则{ 返回true; } }) )

我有一个登录保护,基本上检查用户是否登录。如果他已登录,它将跳过登录并转到主页。我写了这段代码,它很有效:

canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot){
返回此.store.select(fromApp.isAuthenticated)
.管道(取(1),
映射(已验证=>{
如果(未经验证){
this.router.navigate(['/home']);
返回false;
}否则{
返回true;
}
})
)
}
现在,由于我不必更改或编辑输出数据(isAuthenticated boolean),我想:为什么不使用tap运算符呢?因此,我重新编写代码:

canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot){
返回此.store.select(fromApp.isAuthenticated)
.管道(取(1),
这里------->tap(isAuthenticated=>{是
canActivate
的签名:

接口可以激活{
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察的|承诺|布尔值
}

canActivate
必须返回
boolean
Promise
。因此,您必须
map
它并返回
boolean
Promise
点击
canActivate
将不起作用。

防护装置
canActivate
必须返回
可观察的
,以便角度防护装置机械装置尼斯姆开始工作了

使用
map
可以定义一个与
isAuthenticated
不同的返回,这可能解释了您看到的情况


在第一个版本中,
canActivate
acutally返回一个可观察的
——在第二个版本中,它返回这个
this.store.select(fromApp.isAuthenticated).pipe(take(1))
,可能不是您想要的。

“tap”未修改响应。“tap”,当订阅完成时,调用execute the Acction,但理论上,如果必须修改值,我应该使用map(isAuthenticated)…不是吗?在tap中的代码中,返回值是不必要的,但导航必须正确。您是指“返回false/true”吗?在“映射”代码中也不需要返回false/true吗?但是您确实在映射版本中更改或编辑了输出数据;您反转了布尔值。但是您可以将路由分离为tap(映射后):-)这并不意味着您必须映射它;store.select return是什么?如果它已经是布尔值的可观察值,那么点击就可以了。我认为这是一个值问题,而不是类型问题。所以点击只需继续流,而不返回任何内容?@JanRecker lol很高兴再次看到您的帮助:D您的意思是什么?是否发送一个与tap()一起工作的新操作和管理路由?tap不会修改流,它用于在流中添加副作用,例如控制台日志(用于故障排除)。再次您好:-)在我个人的rxjs宗教(据说,非常个人化)中,我将所有不会改变流的内容提取为“taps”。我的理由是,我喜欢“意图”“映射”的意图是为了改变流,tap的目的是处理副作用。没有必要这样做,但我觉得它更可读。关于该操作,我喜欢这个想法。如果您有任何清理工作要做,该操作可以很好地处理它。如果没有,新URL本身应该是一个状态更改。相同的注释: