block() 、 subscribe() 和 subscribe(-) 之间有什么区别

What is the difference between block() , subscribe() and subscribe(-)

Mono.delay(Duration.ofMillis(10)).map(d -> {
            System.out.println(d);
            return d;
        }).block();

输出 : 0

当我使用 subscribe() 或 subscribe(-) 方法而不是 block() 调用时,无法在控制台上看到任何输出

Mono.delay(Duration.ofMillis(10)).map(d -> {
        System.out.println(d);
        return d;
    }).subscribe(System.out::println);

我们需要在这个 Mono.delay(-) 方法之后只使用 doOnSubscribe(-) 吗?

 Mono.delay(Duration.ofMillis(10)).doOnSubscribe(s -> {
        System.out.println("its printing doOnSubscribe");
    }).map(d -> {
        System.out.println(d);
        return d;
    }).subscribe(System.out::println);

output 其打印 doOnSubscribe

您的 block() 调用明确保留主线程,直到发布者完成。当它完成时,它执行了 map() 调用,因此打印了值。

另一方面,您的 subscribe() 调用在单独的调度程序上异步执行 Mono,让您的主线程完成。由于默认使用的调度程序使用守护线程来执行您的订阅,因此您的程序不会在终止前等待它完成。

如果您引入足够长的延迟以使 Mono 完成,您将看到预期的结果:

Mono.delay(Duration.ofMillis(10)).map(d -> {
    System.out.println(d);
    return d;
}).subscribe(System.out::println);

Thread.currentThread().sleep(500);

0 然后打印两次,一次用于 map() 调用,一次由 System.out::println 作为消费者使用。

在现实世界的用例中,您显然不会随意进行 sleep() 调用 - CountDownLatch 将是更明智的选择:

CountDownLatch cdl = new CountDownLatch(1);
Mono.delay(Duration.ofMillis(10))
        .map(d -> {
            System.out.println(d);
            return d;
        })
        .doOnTerminate(() -> cdl.countDown())
        .subscribe(System.out::println);
cdl.await();