Saltar al contenido

¿Qué hace Mono.defer ()?

Solución:

Es un poco una simplificación excesiva, pero conceptualmente las fuentes de Reactor son vagas o ansiosas. Se espera que los más avanzados, como una solicitud HTTP, se evalúen con pereza. Por otro lado los más sencillos como Mono.just o Flux.fromIterable están ansiosos.

Con eso, me refiero a que llamar Mono.just(System.currentTimeMillis()) Invocará inmediatamente el currentTimeMillis() método y capturar el resultado. Dicho resultado es solo emitido por el Mono una vez suscrito. Suscribirse varias veces tampoco cambia el valor:

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

los defer El operador está ahí para hacer que esta fuente sea perezosa, reevaluando el contenido de la lambda cada vez que hay un nuevo suscriptor:

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

con palabras simples si ves en la primera vista es como Mono.just () pero no lo es. cuando ejecuta Mono.just (), crea inmediatamente un Observable (Mono) y lo reutiliza, pero cuando usa diferir, no lo crea de inmediato, crea un nuevo Observable en cada suscripción.

Un caso de uso para ver la diferencia

    int a = 5;
@Override
public void run(String... args) throws Exception {

    Mono<Integer> monoJust = Mono.just(a);
    Mono<Integer> monoDefer = Mono.defer(() -> Mono.just(a));

    monoJust.subscribe(integer1 -> System.out.println(integer1));
    monoDefer.subscribe(integer1 -> System.out.println(integer1));

    a = 7;
    monoJust.subscribe(integer1 -> System.out.println(integer1));
    monoDefer.subscribe(integer1 -> System.out.println(integer1));
}

impresión: 5,5,5,7

si ve mono.just ha creado lo observable de inmediato y no cambia incluso si el valor ha cambiado, pero el diferido crea lo observable en la suscripción, por lo que trabajará con el valor actual de suscripción

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *