Apply Котлина не работает должным образом с Reactor Mono - PullRequest
0 голосов
/ 12 января 2019

У меня есть ситуация, в которой я не могу понять, что применяет метод Котлина , используемый для Реактора Моно объекта. Когда из метода apply я вызываю методы объекта mono, вызываемые методы Mono вообще не отвечают.

Пример без применяется (работает как положено):

reactor.core.publisher.Mono
    .just(1)
    .doOnSuccessOrError { i, t ->
        println("doOnSuccessOrError")
    }
    .subscribe {
        println("subscribe: value=$it")
    }

Который выдает консольный вывод:

doOnSuccessOrError
subscribe: value=1

Как и ожидалось, сначала вызывается doOnSuccessOrError () , затем subscribe () .

Пример с apply (работает не так, как ожидалось):

reactor.core.publisher.Mono
    .just(1)
    .apply {
        println("Apply")
        doOnSuccessOrError { i, t ->
            println("doOnSuccessOrError")
        }
    }
    .subscribe {
        println("subscribe: value=$it")
    }

Который выдает консольный вывод:

Apply
subscribe: value=1

Теперь он больше не печатает doOnSuccessOrError, что противоположно тому, что я ожидал. Почему не напечатано?

1 Ответ

0 голосов
/ 12 января 2019

Этот вопрос не относится только к Mono, но мне не удалось воспроизвести его, используя тестовый класс simpel для обобщения проблемы. Но после прочтения Применение Kotlin к String не работает должным образом , я понял, что это (конечно) вызвано неизменностью Mono, что также относится к Strings.

Итак, в этом коде:

monoObject.apply {
    println("Apply")
    doOnSuccessOrError { i, t ->
        println("doOnSuccessOrError")
    }
}

apply возвращает тот же объект, что и переменная, на которую ссылается monoObject . Но из-за неизменности Mono, вызов doOnSuccessOrError () возвращает новый объект Mono, который отличается от того, на который ссылается monoObject . Поскольку результат doOnSuccessOrError () (новый объект Mono) вообще не сохраняется, лямбда, которая ему была дана, вызываться не будет. Что объясняет вопрос.

Решение состоит в том, чтобы вместо этого использовать run от Kotlin, просто заменив «apply» на «run».

...