2016-10-09 4 views
0

В моем приложении Angular2 я использую canActivate, чтобы разрешить доступ к страницам. Часть этого заключается в том, чтобы проверить с сервером, что токен не был подделан, поэтому, прежде чем я смогу решить, что пользователю может быть предоставлен доступ, мне нужно вызвать api. Это означает подписку на Наблюдение и ожидание ответа.Ожидание по наблюдаемой подписке Angelar2

Мне нужно вернуть true или false, но поскольку я делаю вызов asyns, я не могу вернуться на основе моего ответа. Я понимаю, что не могу ждать, так как это однопоточный, но мне нужно как-то блокировать, пока у меня не будет ответа от api. мой canActivate выглядит следующим образом:

canActivate() { 
    this.guardClient.checkToken("token") 
    .subscribe(response => { 
    let responseText = response.text().replace(/"/g, ''); 
    if (responseText === 'Ok') 
    { 
     return true; 
    } 
    if(responseText === 'denied') { 

     this.router.navigate(['login']); // redirecting to login 
     return false; 
    } 
    }); 
} 

Может кто-нибудь сказать мне, как решить эту проблему ??

ответ

1

При взгляде на интерфейс CanActivate в угловом 2 я вижу следующее:

export interface CanActivate { 
    canActivate(route: ActivatedRouteSnapshot, state:  RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean; 
} 

Как вы можете видеть, вы можете просто вернуться к наблюдаемому, а также, и не только логическое значение. Это означает, что ваш код можно переписать примерно так.

canActivate() { 
return this.guardClient.checkToken("token") 
    .map(response => { 
    let responseText = response.text().replace(/"/g, ''); 
    if (responseText === ' Ok') 
     { 
     return true; 
     } 
    if(responseText === 'denied') { 
     this.router.navigate(['login']); // redirecting to login 
     return false; 
    } 
}); 
} 

Это позволит сделать угловое ожидание для наблюдаемого, чтобы решить, прежде чем решить, если маршрут может быть показан или нет. Обратите внимание, что этот метод должен быть довольно быстрым, чтобы избежать медленных нагрузок.

+0

Спасибо, что сделал! :) – methgaard