【问题标题】:Using subscription in router can activate in angular2/4 fails在路由器中使用订阅可以在 angular2/4 中激活失败
【发布时间】:2018-01-15 03:19:53
【问题描述】:

我试图保护我的路线,但收到一个错误

Type 'Subscription' is not assignable to type 'boolean 
     | Promise<boolean> | Observable<any>'

所以在路由守卫中有

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> | Promise<boolean> | boolean {
     return this._authService.checkLoggedin().subscribe((res)=>{
     if(!res){
        console.log("res is not here..")
      }
      return res;

    },(err)=>{

     console.log("error is", err);
  })
 }   

所以我有我的身份验证服务

  checkLoggedin(): Observable<any> {
    if (!this._accesstokenService.getToken('access_token')) {
      return Observable.of(false); //just checks for localstorage
     }
      //if the access token exists  validate it on the server
    return this._http.post(this.authurl + 'auth/is-loggedin', 1)
      .map((res) => {
       return Observable.of(res);
      });
 }

我哪里错了。我仍然想继续使用 checkloggedin 方法中的 observable

【问题讨论】:

    标签: angular typescript rxjs angular2-services


    【解决方案1】:

    您需要在 canActivate 中返回一个 observable 而不是订阅

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> | Promise<boolean> | boolean {
         return this._authService.checkLoggedin();
     }  
    

    你的返回签名是这样规定的,但如果我是你,我会让它返回一个布尔值并保持简单。

    【讨论】:

    • 但是在验证服务器上的访问令牌的情况下返回一个承诺会使其同步
    • 你从哪里得到承诺? Observables 不是承诺
    • Observable 的工作方式与 Promise 一样,请参见:stackoverflow.com/questions/37364973/… 它们用于异步活动
    • 我正在尝试获取 checkLoggedin 的结果,它返回一个可观察的对象,在 canactivate 中我无法获得结果,在这种情况下我必须订阅 checkloggedin Observable 的结果但随后失败跨度>
    • 有什么问题?此外,可观察对象可以做的不仅仅是承诺。所以我的问题是为什么你的服务方法会返回一个承诺?
    猜你喜欢
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多