Вернуть логическое значение от подписки в Guard in Angular 5 - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь вернуть истину, если подписчик вернет мне данные.Затем, если ошибка, я хочу, чтобы она вернула мне ложь.

Более подробно, моя подписка возвращает меня, если есть куки или нет.Если у меня есть cookie, я хочу вернуть мне True и подписаться на другую функцию, а если в подписке происходит ошибка False.

В случае наличия cookie он должен подписаться на другую функцию, которая возвращает значение.Так что у меня есть подписка внутри другого, и если они оба возвращают мне значение, которое я хочу, оно должно быть ИСТИНА.

Позвольте мне показать вам мой код:

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, и сотрудник авторизован, если нет, то вернуть 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);
      });*/

}

1 Ответ

0 голосов
/ 01 октября 2018

Похоже, вы не очень знакомы с охранником / распознавателем.Guard и resolver будут вызываться маршрутизатором.Если вы вернете Promise или Observable, маршрутизатор будет ждать, пока они не будут решены.

В вашем случае вы делаете асинхронный вызов в своем методе, но не возвращаете обещание / доступное, поэтому ваша охрана будет возвращать только «неопределенное» (да, вы возвращаете false и возвращаете true в своем вызове, но они будутбудет выполнен позже, и никто не примет их в качестве окончательного решения).

Вот простой способ сделать то, что вы хотите, используя обещание await / async (это можно было бы сделать также с 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;
 }  
}
...