APP_INITLIZER中的SwitchMap无限重复

时间:2018-09-03 14:46:45

标签: angular rxjs

我有一个脚本来验证要在应用初始化期间关闭的用户,因此我在APP_INITIALIZER中提供了app.module。它发出一个HTTP调用,该调用通过两个switchMaps运行,然后转换为Promise。 HTTP调用有效,然后第一个switchMap触发一次,然后第二个switchMap无限触发并锁定应用程序。我无法弄清楚发生了什么,也无法弄清楚如何调试它。它在某个时候起作用了,我不确定是什么改变打破了它。

以下是返回到APP_INITLIZER的方法:

validateUser() {
    let jwt = this.getJWT();
    if (jwt && jwt.length) {
        return this.api
            .get<{ data: { tokenValid: boolean } }>('/users/validateToken', { token: jwt })
            .pipe(
                switchMap(response => {
                    if (response.data.tokenValid) {
                        this.setUser()
                        return this.currentUser$.asObservable()
                    } else {
                        return ObservableOf(false);
                    }
                }),
                switchMap(currentUser => {
                    if (currentUser) {
                        currentUser.getEvents();
                        this.setCurrentUser(currentUser);
                    } else {
                        this.logout()
                    }

                    return ObservableOf(true);
                })
            )
            .toPromise();
    }

    return Promise.resolve(true);
}

currentUser$是重要的行为主题。

1 个答案:

答案 0 :(得分:0)

您在第一个SwitchMap中返回mkdirp

然后,您从第二个SwitchMap glob更新当前用户。

这将导致可观察到的第一个SwitchMap内部发出一个新值。因此它会无限期地运行。

虽然我认为您的代码可以改进,但是最简单的解决方案是更改一行。

this.currentUser$.asObservable()