Это немного упрощение, но концептуально источники Reactor либо ленивы, либо нетерпеливы.Ожидается, что более продвинутые, такие как HTTP-запрос, будут лениво оцениваться.С другой стороны, стремятся самые простые, такие как Mono.just
или Flux.fromIterable
.
Под этим я подразумеваю, что вызов Mono.just(System.currentTimeMillis())
немедленно вызовет метод currentTimeMillis()
и захватит результат.Указанный результат только испускается Mono
после того, как он подписан.Многократная подписка также не меняет значение:
Mono<Long> clock = Mono.just(System.currentTimeMillis());
//time == t0
Thread.sleep(10_000);
//time == t10
clock.block(); //we use block for demonstration purposes, returns t0
Thread.sleep(7_000);
//time == t17
clock.block(); //we re-subscribe to clock, still returns t0
Оператор defer
призван сделать этот источник ленивым, переоценивая содержимое лямбды каждый раз, когда появляется новыйподписчик :
Mono<Long> clock = Mono.defer(() -> Mono.just(System.currentTimeMillis()));
//time == t0
Thread.sleep(10_000);
//time == t10
clock.block(); //invoked currentTimeMillis() here and returns t10
Thread.sleep(7_000);
//time == t17
clock.block(); //invoke currentTimeMillis() once again here and returns t17