首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CanActivate:将Observable<Observable<boolean>>转换为Observable<boolean>

CanActivate:将Observable<Observable<boolean>>转换为Observable<boolean>
EN

Stack Overflow用户
提问于 2017-11-15 20:51:56
回答 1查看 759关注 0票数 1

我有一个只有所有者才能访问的用户设置页面。我想使用CanActivate来实现这个限制。CanActivate要求输出为布尔值或布尔值的可观测值。但是,我的代码输出了一个可观察的布尔值。

代码语言:javascript
复制
Type 'Observable<Observable<boolean>>' is not assignable to type 'boolean | Observable<boolean> | Promise<boolean>'.

这是我的代码

代码语言:javascript
复制
@Injectable()
export class UserGuard implements CanActivate {

  constructor(
    private route: ActivatedRoute,
    private userService: UserService
  ) { }

  canActivate() {
    const username = this.route.snapshot.paramMap.get('username');

    return this.userService.authState().map(auth => {
      return this.userService.getByUid(auth.uid).map(user => {
        return user.username === username ? true : false;
      });
    });
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-15 20:58:29

使用.switchMap来使可观察到的东西变平。在这里阅读更多信息:https://www.learnrxjs.io/operators/transformation/switchmap.html

本质上,如果您将.switchMap链接到一个可观测的源,并且返回一个内部可观测的源,则该可观测值将被订阅并发出其值,而不是发出可观测的自身:

代码语言:javascript
复制
return this.userService.authState().switchMap(auth => {

在这种情况下,您还可以通过将.map链接到原始的可观察流来稍微平缓代码。

代码语言:javascript
复制
return this.userService.authState().switchMap(auth =>
  this.userService.getByUid(auth.uid)
).map(user => user.username === username);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47317019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档