Прежде всего, ничего не произойдет, пока кто-то не подпишется.Подписаться - это последняя вещь в цепочке, которая будет запускать все события.
Во-вторых, вам нужно понять разницу между запуском чего-либо в параллельном и неблокирующем запусках.
, чтобы разрешить вашу первую карту, он должен сделать остальной вызов, затем с ответом, который он должен сделать для вашей второй карты.Эти два не будут работать в параллеле.
Ваш responseMono.map
не может быть запущен, пока в Mono<Response> responseMono
действительно что-то не будет.Думайте об этом как о Promise
, который будет сигнализировать приложению, когда оно будет разрешено.
Или вы можете думать о нем как о цепочке обратных вызовов.
Итак, в вашем примере вы делаетеclientRequestHandler.makeAsyncCall()
но вы возвращаете Mono<CoverResponse>
следующую часть, которую responseMono.map
не сработает, пока в моно не будет CoverResponse
.Таким образом, ваш «асинхронный» вызов, вероятно, является асинхронным, но все еще придерживается порядка следования списков, поскольку все в последовательном потоке.
Но map
- это функция отображения.Он берет что-то из коробки, выполняет вычисления для чего-то в коробке, а затем возвращает новое значение или тип.
Что делает реактив лучше, чем другие опции, так это то, что когда вы делаете side effect
удаленный вызовгде-то, что занимает время, поток, который обрабатывает это, не будет зависать и ждать окончания внешнего запроса, он начнет делать другие вещи, такие как обработка других запросов.
Затем, когда Mono<Response>
подает сигнал системечто в ответе есть «что-то в коробке», тогда этот же поток или любой другой доступный поток продолжит обработку запроса.