我在一些 Spring webflux 代码中遇到过 Mono.defer()
我在文档中查找了该方法,但不明白其中的解释:
“创建一个 Mono 提供者,它将为下游的每个订阅者提供一个要订阅的目标 Mono”
请给我一个解释和一个例子。有没有我可以参考的一堆 Reactor 示例代码(他们的单元测试?)的地方。
谢谢
原文由 James Render 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在一些 Spring webflux 代码中遇到过 Mono.defer()
我在文档中查找了该方法,但不明白其中的解释:
“创建一个 Mono 提供者,它将为下游的每个订阅者提供一个要订阅的目标 Mono”
请给我一个解释和一个例子。有没有我可以参考的一堆 Reactor 示例代码(他们的单元测试?)的地方。
谢谢
原文由 James Render 发布,翻译遵循 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 许可协议
4 回答1.6k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
1 回答2.6k 阅读✓ 已解决
4 回答2.2k 阅读
3 回答982 阅读✓ 已解决
2 回答807 阅读✓ 已解决
2 回答1.4k 阅读
这有点过于简单化了,但从概念上讲,Reactor 源要么是惰性的,要么是急切的。更高级的请求,如 HTTP 请求,预计将被惰性评估。另一方面,最简单的像
Mono.just
或Flux.fromIterable
是渴望的。也就是说,我的意思是调用
Mono.just(System.currentTimeMillis())
将立即调用currentTimeMillis()
方法并捕获结果。所述结果仅由Mono
订阅后 发出。多次订阅也不会改变值:defer
操作员在那里使这个源变得懒惰, 每次有新订阅者时 重新评估 lambda 的内容: