switchIfEmpty всегда вызывается - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть такой метод:

fun getActiveVersionWithCacheMiss(type: String): Mono<ActiveVersion> {
        return activeVersionRepository.findByType(type)
                .switchIfEmpty(
                        Mono.defer(return persist(ActiveVersion(type,1)))
                )
    }

Метод persist - это простой метод, который сохраняет активную версию:

fun persist(activeVersion: ActiveVersion): Mono<ActiveVersion>{...}

В моем тесте я смоделировал activeVersionRepository, чтобы вернуть простое значение для findByType. Во время отладки activeVersionRepository.findByType(type).block() оценивает значение и определенно не является пустым. Мне интересно, почему, несмотря на использование defer, switchIfEmpty все еще вызывается?

1 Ответ

1 голос
/ 24 апреля 2020

Проблема return. Аргумент switchIfEmpty должен оцениваться независимо от того, выдает ли findByType значение, что означает, что аргумент defer должен быть оценен, и return вернется из всей функции getActiveVersionWithCacheMiss.

Хотя я не понимаю, как этот код может компилироваться; return persist(...) не имеет значения, которое может использовать Mono.defer. У вас есть фигурные скобки {}, а не скобки () где-нибудь?

...