Typescript drop事件,事件未定义

时间:2018-03-20 14:18:36

标签: angular typescript

对于我的网站,我正在使用带有角度的.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个控制台日志和“我等了吗?”在“用户刷新”之前触发。如何在其余的代码中等待,直到用户服务中已设置用户?

1 个答案:

答案 0 :(得分:1)

因为它是异步的。使用asyncawait

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)
    }
}