Angular 2等待嵌套的可观察对象完成

标签 angular

在导航到另一个页面之前,我需要等待我的两个嵌套 Observable 完成。 我不知道执行此操作的最佳方法是什么,因为它们是嵌套的,因此我的 Angular 应用程序出现了同步问题。 Observables 正在我的身份验证服务中设置。 authentication.service.ts:

login(username: string, password: string) {
        let reqUrl = AppSettings.__USER_TOKEN_URL;
        let reqHeaders = this.authConfig.token.headers;
        let reqBody = encodeURI(
            this.authConfig.token.body
                .replace(/{{ username }}/g, username)
                .replace(/{{ password }}/g, password));

        //
        // Get token, then get user identity, if login successfull.
        //

        return this.http.post(reqUrl, reqBody, reqHeaders)
            .map((response) => this.getIdentity(response))
            .catch(this.handleErr);
    }

private getIdentity(response: Response) {

        //
        // Get user identity based on token.
        //

        let body = response.json();
        let token = body.access_token;

        if (null != token && undefined != token) {
            this.authConfig
                .identity
                .headers
                .headers.set('authorization', 'Bearer ' + token);

            let reqUrl = AppSettings.__USER_IDENTITY_URL
            let reqHeaders = this.authConfig.identity.headers;
            let reqbody = this.authConfig.identity.body;

            return this.http.post(reqUrl, reqbody, reqHeaders)
                .map((response) => this.setUser(response))
                .catch(this.handleErr)
                .subscribe();
        }
    }

然后在我的登录组件中,我试图调用服务 login() 方法,当它完成时,我想导航到另一个实例。 login.component.ts:

login() {
        this.loading = true;
        this.authenticationService.login(this.model.username, this.model.password).subscribe(
            data => { },
            error => { console.log('Error authenticating: ' + error); },
            () => {  this.router.navigate([this.returnUrl]) });
    }

但它不起作用。当 router.navigate 被触发时,Observables 仍在运行。 对 Angular 菜鸟有什么想法吗? 提前致谢。

最佳答案

问题是您只是在 getIdentity() 中调用 subscribe,这不会使两个可观察对象连续

相反,您需要返回可观察对象而不是那里的订阅对象并使用 switchMap

获取身份:

private getIdentity(response: Response) {

        //
        // Get user identity based on token.
        //

        let body = response.json();
        let token = body.access_token;

        if (null != token && undefined != token) {
            this.authConfig
                .identity
                .headers
                .headers.set('authorization', 'Bearer ' + token);

            let reqUrl = AppSettings.__USER_IDENTITY_URL
            let reqHeaders = this.authConfig.identity.headers;
            let reqbody = this.authConfig.identity.body;

            return this.http.post(reqUrl, reqbody, reqHeaders)
                .map((response) => this.setUser(response))//return observable.
        }
}

在登录调用中:

return this.http.post(reqUrl, reqBody, reqHeaders)
        .switchMap((response) => this.getIdentity(response))
        .catch(this.handleErr);

switchMap 将切换到第二个 observable 并在第一个完成时返回它。

关于Angular 2等待嵌套的可观察对象完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46237390/

相关文章:

Angular 2——更改组件选择器

angular - 如何在法语版本中使用 ngx_bootstrap datepicker

css - ionic : Scrollable areas with fixed areas layout

javascript - 将本地库链接到 Angular 5 项目

javascript - iFrame 关闭时 session 存储不会重置

从 v7 到 v8 的 Angular 通用更新

angular - 这是在 angularfire2 中使用 rxjs MergeMap 的正确方法吗?

javascript - 无法读取模板中未定义的属性

javascript - Angular 过滤阵列

html - 在 HTML 中对字符串插值进行样式设置 - Angular