В чем разница между функциями ожидания (сопрограммы) и подписки на Reactor - PullRequest
0 голосов
/ 03 марта 2020

Я использую Kotlin + Reactor (Mono и Flux), и я хочу знать разницу между использованием функции await...() (от kotlin -кореактив ) и subscribe() ( от реактора). Я привел два примера, чтобы показать, что я пытаюсь сделать.

Пример 1 (с функцией await):

@Test
internal fun test() = runBlockingTest {
    Mono.error<String>(IllegalStateException("exception"))
        .doOnError {
            print("error")
        }.awaitFirst().let {
            print("success")
        }
}

Вывод: "ошибка" с трассировкой стека IllegalStateException .

Пример 2 (с функцией подписки):

@Test
internal fun test() = runBlockingTest {
    Mono.error<String>(IllegalStateException("exception"))
        .doOnError {
            print("error")
        }.subscribe {
            print("success")
        }
}

Вывод: просто «ошибка».

Почему в примере 1 показана трассировка стека и пример 2 не показывает?

Спасибо.

1 Ответ

0 голосов
/ 04 марта 2020

Когда вы вызываете subscribe в реактивной цепочке, вы отделяете ее от основного потока, она становится независимой и потенциально асинхронной. Ошибка передается по реактивному потоку как сигнал, а не как традиционно генерируемое исключение. В этом случае за обработку ошибок отвечает реактивная цепочка с использованием таких операторов, как doOnError, onErrorMap, onErrorReturn, et c.

С другой стороны Kotlin s await нарушает эту независимость и присоединяет реактивный поток обратно к основному потоку и позволяет писать реактивный / асинхронный код так, как это было бы необходимо (например: блоки try-catch, типы возвращаемых функций без развертки и т. д. c.).

...