对于我的网站,我正在使用带有角度的.net核心2。所以我正在使用这个登录系统,但我无法理解一些东西。
我正在使用角度防护来保护我的网页免受未经授权的访问。我还有一个用户服务来从.net core 2后端获取当前登录用户。 My Guard查看用户服务以查找当前用户,如果没有用户我们拨打电话获取当前用户。如果没有当前授权用户,则将用户重定向到登录页面。这一切都很好,除了我们仍然从服务器获取用户代码继续的事实,导致每次都没有登录用户。
后卫:
canActivate(next: ActivatedRouteSnapshot,
state: RouterStateSnapshot) {
if (this.userService.user == undefined) {
this.userService.RefreshUser();
console.log("did i wait?");
}
if (this.userService.IsAuthenticated()) {
console.log("you are logged in");
return true;
}
else {
this.router.navigate(['/login']);
}
return false;
}
所以userService.RefreshUser()找到一个api调用的用户:
public RefreshUser() {
this.http.get(this.baseUrl + "api/Account/GetCurrentUser").subscribe(result => {
try {
this.SetUser(JSON.stringify(result.json()));
console.log("user refreshed");
}
catch(e){
}
}, error => console.error(error));
}
但它不会等待用户被检索。我输入了2个控制台日志和“我等了吗?”在“用户刷新”之前触发。如何在其余的代码中等待,直到用户服务中已设置用户?
答案 0 :(得分:1)
因为它是异步的。使用async
和await
:
async canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (this.userService.user == undefined) {
await this.userService.RefreshUser();
console.log("did i wait?");
}
if (this.userService.IsAuthenticated()) {
console.log("you are logged in");
return true;
}
else {
this.router.navigate(['/login']);
}
return false;
}
public async RefreshUser() {
try {
const user = await this.http
.get(this.baseUrl + "api/Account/GetCurrentUser")
.map(result => JSON.stringify(result.json()))
.toPromise()
this.SetUser(user);
console.log("user refreshed");
}
catch(e){
console.error(error)
}
}