Необходимо использовать тайм-аут внутри подписки Observable, чтобы получить точные данные - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть две наблюдаемые в контейнере с именами settings и settingsLoading.У меня есть вызов API, который извлекает некоторые настройки, и после его завершения для settingsLoading будет установлено значение true, а settings будет содержать данные из API.Я передаю данные settings компоненту и передаю settingsLoading тому же компоненту, что и Observable.

В этом компоненте, как показано ниже, я подписываюсь на settingsLoading Observable, и один раззагрузка ложна, я делаю пару журналов консоли, чтобы я мог посмотреть на данные настроек, которые теперь должны быть установлены.Журнал консоли всегда возвращает ноль, если я не заверну его в течение 0 секунд.Зачем мне это делать?Это надежный способ справиться с этим?Есть ли лучший способ сделать это, чтобы я мог избежать тайм-аута?

В приведенном ниже коде первый журнал консоли всегда будет возвращать ноль, а второй, кажется, всегда содержит данные, которые я ожидаю:

subscribeToLoadSettings() {
    this.settingsLoading.subscribe(loading => {
        if (!loading) {
            // This doesn't work
            console.log('settings', this.settings);
            setTimeout(() => {
                // This works
                console.log('settings', this.settings);
            }, 0);
        }
    });
}

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Если вы подписываетесь на другую подписку, это будет работать нормально, без тайм-аута !!!

Но для кода рефакторинга вы можете использовать mergeMap или switchMap.

См. Код в: Как выполнить рефакторинг подписки внутри подписки в rxjs

С уважением!

0 голосов
/ 05 апреля 2019

Когда одна наблюдаемая зависит от результата другой наблюдаемой, вы можете использовать оператор RxJS, например switchMap.

...