如何在Angular中等待http请求完成?

时间:2018-02-08 23:30:43

标签: angular typescript observable

我一直在前端构建一个带有Angular 4的SPA,在后端构建一个带有ASP.NET Core 2的SPA。基本上,我试图在给定有效令牌的情况下自动续订用户登录。例如,当我重新加载页面时,我希望Angular保持登录状态。我将令牌存储在本地存储中,以及用户对象,以便我可以检查一些用户属性(如果他/她已登录例子)。

我应该如何强制角度等待http请求完成? 这是.net获取服务:

get<T>(url: string): Observable<T> {
    let options = this.doHeaders();
    return this.doSub(this.http.get(this.doUrl(url), options));
}

private doSub<T>(obs: Observable<Response>) {
    var ob1: Observable<T> = obs.map(this.extractData)
        .catch(this.handleError);

    return ob1;
}

这是HTTP请求代码:

   getUser() {

    if (this.storage.token == null || this.storage.token == '') {
        return;
    }

    this.net.get<LoginModel>(`Authentication/GetUser`).subscribe(t => {
        this.storage.token = t.token;
        this.storage.user = t.user;
        console.log(this.storage.user);
    });
}

以下是我正在检查用户的方式:

export class StorageService {

    constructor(
        private storage: LocalStorageService
    ) {
    }

    public user: User = null;

    public get isLoggedIn(): boolean {
        return this.user != null;
    }

}

export class IsLoggedIn implements CanActivate {

constructor(
    private storage: StorageService,
    private router: Router
) { }

canActivate(
    childRoute: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
) {
    if (this.storage.isLoggedIn) {
        return true;
    }

    this.router.navigate(['account/login'], {
        queryParams: {
            return: state.url,
            message: 'You must be logged in'
        }
    });
    return false;
}}

真正的问题是:每当我尝试在受保护的页面上重新加载页面时,Angular都不会等待http完成,并将我重定向到登录页面。大约几秒后,它会登录,但我已经被重定向了。 上面的代码正在AppComponent(NgOnInit)上执行。提前谢谢。

3 个答案:

答案 0 :(得分:3)

您可以将promises与async / await

一起使用
async getUser() {
    if (this.storage.token == null || this.storage.token == '') {
        return;
    }

    const t = await this.net.get<LoginModel>(`Authentication/GetUser`).toPromise();

    this.storage.token = t.token;
    this.storage.user = t.user;

    console.log(this.storage.user);
}

查看更多:

答案 1 :(得分:2)

在您的观察点上使用.toPromise,然后使用async/await

await this.net.get<LoginModel>(`Authentication/GetUser`).toPromise();

答案 2 :(得分:-1)

您不能对Angular HttpClient返回的Observable使用async / await语法,因此首先需要首先将observable转换为promise。

幸运的是,Observable接口导出了一个toPromise()方法,该方法返回了来自Observable的承诺:

await this.net.get<LoginModel>('Authentication/GetUser').toPromise();

请参阅此示例,了解如何use Async/Await with Angular HttpClient