Вернуть логическое значение из подписки в Guard в Angular 5

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

Более того, моя подписка возвращает мне, есть ли cookie или нет. Если у меня есть 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);
      });*/

}

person Alberto Molina    schedule 01.10.2018    source источник
comment
В этом случае вы должны использовать map вместо subscribe.   -  person SiddAjmera    schedule 01.10.2018
comment
Не работает @SiddAjmera   -  person Alberto Molina    schedule 01.10.2018
comment
Вы можете просто вернуть Observable<boolean> в качестве возврата метода canActivate.   -  person Roberto Zvjerković    schedule 01.10.2018
comment
Есть ошибки? Вы не возвращаете ничего из своей Guard BTW.   -  person SiddAjmera    schedule 01.10.2018
comment
Это не работает: .map ((cookie) = ›{if (cookie) {return true;} else {return false;}});   -  person Alberto Molina    schedule 01.10.2018


Ответы (1)


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

В вашем случае вы делаете асинхронный вызов в своем методе, но вы не возвращаете обещание / obversable, поэтому ваша охрана вернет только «undefined» (да, вы вернете 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;
 }  
}
person xrobert35    schedule 01.10.2018