Return Angular 5 中 Guard 中订阅的布尔值

Return a boolean from subscribe in a Guard in Angular 5

我正在尝试 return 一个 true 以防订阅 return 我的数据。然后,如果错误,我希望它 return me false.

更深入一点,如果有或没有 cookie,我的订阅 return 会告诉我。如果有 cookie,我想 return 给我一个 True 并订阅另一个函数,如果订阅出错则为 False。

如果有 cookie,它必须订阅另一个 return 值的函数。所以我在另一个里面有一个订阅,如果他们两个都 return 给我一个我想要的值,它必须是 TRUE。

让我给你看我的代码:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {

 this.secureService.config({
    controlType: (this.env.useCookiesFromSTS
        ? SecurityConstant.COOKIE_CONTROL_TYPE
        : SecurityConstant.TOKEN_CONTROL_TYPE
    ),
    advanceTime: this.env.securityConfig_advanceTime,
    isDebug: false,
    isSecure: this.env.securityConfig_isSecure,
    whiteList: ['directline.botframework.com']
  }, {
    urlService: this.env.endpoints_urlSCC,
    urlAttrUser: this.env.endpoints_urlUDS
  },  this.env.appName)
    .subscribe(
      (cookie) => {
        if(cookie){
         this.secureService.getAttrUser(['ComTipoEmpleado'], [''])
         .subscribe(
           //Return true for the guard
           (responseAttrUser) => console.log(responseAttrUser),
           (error) => { console.error(error);
        }

      });
      },
      (err) => {
         return false;
      console.error(err);
    });
}

基本上我需要控制我的浏览器是否有 cookie 以及员工是否获得授权,如果没有,则 return false。

这不起作用:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): 
boolean {

 this.secureService.config({
    controlType: (this.env.useCookiesFromSTS
        ? SecurityConstant.COOKIE_CONTROL_TYPE
        : SecurityConstant.TOKEN_CONTROL_TYPE
    ),
    advanceTime: this.env.securityConfig_advanceTime,
    isDebug: false,
    isSecure: this.env.securityConfig_isSecure,
    whiteList: ['directline.botframework.com']
  }, {
    urlService: this.env.endpoints_urlSCC,
    urlAttrUser: this.env.endpoints_urlUDS
  },  this.env.appName)
    **.map(
      (cookie) => {
        if (cookie){
          return true;
        } else {
          return false;
        }
      });**

 /*this.secureService.getAttrUser(['ComTipoEmpleado'], [''])
    .subscribe(
      (responseAttrUser) => console.log(responseAttrUser),
      (error) => { console.error(error);
      });*/

}

看来你对guard/resolver不是很熟悉。守卫和解析器将由路由器调用。如果你守卫 return 一个 Promise 或一个 Observable 路由器将等到它们被解决。

在你的情况下,你正在你的方法中进行异步调用,但你没有 returning promise/obversable,所以你的守卫只会 return "undefined" (是的你在通话中 return false 和 return true 但这些将在稍后执行,没有人会考虑它们)。

这是使用 await/async promise 做你想做的事情的简单方法(这也可以用 Observable 完成)

async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
 try {
 const cookie = await this.secureService.config({
    controlType: (this.env.useCookiesFromSTS
        ? SecurityConstant.COOKIE_CONTROL_TYPE
        : SecurityConstant.TOKEN_CONTROL_TYPE
    ),
    advanceTime: this.env.securityConfig_advanceTime,
    isDebug: false,
    isSecure: this.env.securityConfig_isSecure,
    whiteList: ['directline.botframework.com']
  }, {
    urlService: this.env.endpoints_urlSCC,
    urlAttrUser: this.env.endpoints_urlUDS
  },  this.env.appName).toPromise();

  if(cookie){
    const user = await this.secureService.getAttrUser(['ComTipoEmpleado'], ['']).toPromise();
    return user != null;
  }else{
    return false;
  } 
 } catch(err) {
   return false;
 }  
}