Mono.defer() 是做什么的?

新手上路,请多包涵

我在一些 Spring webflux 代码中遇到过 Mono.defer()

我在文档中查找了该方法,但不明白其中的解释:

“创建一个 Mono 提供者,它将为下游的每个订阅者提供一个要订阅的目标 Mono”

请给我一个解释和一个例子。有没有我可以参考的一堆 Reactor 示例代码(他们的单元测试?)的地方。

谢谢

原文由 James Render 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.1k
2 个回答

这有点过于简单化了,但从概念上讲,Reactor 源要么是惰性的,要么是急切的。更高级的请求,如 HTTP 请求,预计将被惰性评估。另一方面,最简单的像 Mono.justFlux.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 操作员在那里使这个源变得懒惰, 每次有新订阅者时 重新评估 lambda 的内容:

 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

原文由 Simon Baslé 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您在第一个视图中看到它就像 Mono.just() 但不是,则 用简单的词。当你运行 Mono.just() 它会立即创建一个 Observable(Mono) 并重用它但是当你使用 defer 它不会立即创建它它会在每个订阅中创建一个新的 Observable。

一个用例可以看出差异

    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));
}

打印:

 5
5
5
7

如果你看到 mono.just 立即创建了 observable 并且即使值已经改变它也不会改变但是 defer 在 subscribe 中创建 observable 所以你将使用当前的 onSubscribe 值

原文由 Ricard Kollcaku 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题