从可观察结果返回可观察结果

时间:2018-11-08 13:19:52

标签: angular rxjs observable

我对RxJS非常陌生,所以我不太确定我应该在这里问什么问题。我有一个返回Observable布尔值的服务:

@Injectable
export class UserService {
  private isLoggedInSubject = new ReplaySubject<boolean>(1);
  public isLoggedIn = this.isLoggedInSubject.asObservable();
}

在Angular 6路由防护中,我传递了该值以防止访问路由:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
  return this.userService.isLoggedIn.pipe(take(1)); 
}

如何获取此值,并根据结果返回一个Observable?我已经尝试过类似这样的多种变体,但是似乎缺少一些基本概念,因为这必须是相当普遍的事情。

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
  const isLoggedIn = this.userService.isLoggedIn.pipe(take(1));

  return isLoggedIn.[???something????](x => {
    if (x) {
      console.log('is logged in');
      return Observable.of(true);
    } else {
      console.log('is not logged in ');
      return Observable.of(false);
    }
  });
}

1 个答案:

答案 0 :(得分:1)

您只需将其与更多运算符链接在一起即可:

return this.userService.isLoggedIn.pipe(
  take(1),
  concatMap(x => {
    if (x) {
      console.log('is logged in');
      return Observable.of(true);
    } else {
      console.log('is not logged in ');
      return Observable.of(false);
    })
  },
);

顺便说一句,您甚至不需要返回Observable.of。您只能使用map并返回例如。 false