SwitchMap в APP_INITLIZER повторяется бесконечно - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть скрипт для проверки пользователей, которых я хочу отключить во время инициализации приложения, поэтому я предоставляю APP_INITIALIZER in app.module. Он делает HTTP-вызов, который проходит через два switchMaps, а затем преобразуется в обещание. 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 голосов
/ 03 сентября 2018

Вы возвращаете this.currentUser$.asObservable() в первой SwitchMap.

Затем вы обновляете текущего пользователя из 2nd SwitchMap this.setCurrentUser(currentUser).

Это приведет к тому, что наблюдаемые внутри первого SwitchMap испустят новое значение. Так продолжается до бесконечности.

Хотя я думаю, что ваш код можно улучшить, самое простое решение - это изменить одну строку.

this.currentUser$.asObservable().pipe(first())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...