Jav*_*mer 5 java reactive-programming project-reactor spring-webflux
下面两个执行有什么不同?
Mono.justOrEmpty(someFunction())
.doOnNext(() -> doSomeTask()).subscribe();
Mono.fromCallable(() -> someFunction())
.doOnNext(() -> doSomeTask()).subscribe();
Run Code Online (Sandbox Code Playgroud)
对于Mono.fromCallable,Callable仅当结果Mono被订阅时才被延迟调用。
(您甚至可以将代码片段重写为Mono.fromCallable(this::someFunction)ifsomeFunction不带任何参数)
使用 时Mono.justOrEmpty,操作员会立即捕获该值以供将来发射。因此,实际上,该someFunction()方法在构造时立即调用。
请注意,这两个变体都会正确处理someFunction()返回null(与 不同Mono.just(...))。在这种情况下,结果Mono将简单地完成(onComplete无信号onNext)。
另请注意,如果该方法是阻塞且长时间运行的,则在这两种情况下它都可能是反模式。请参阅https://projectreactor.io/docs/core/release/reference/#faq.wrap-blocking
基本上 usingMono.fromCallable() Callable发出的结果值为Mono。Mono.justOrEmpty()只发出指定的项目,就好像Mono它存在一样。
官方文档中的justOrEmpty描述fromCallable如下:
创建一个新的 Mono,如果非 null,则发出指定的项目,否则仅发出 onComplete。
使用提供的 Callable 创建一个产生其值的 Mono。如果 Callable 解析为 null,则生成的 Mono 将完成为空。
如果您需要更详细的信息Mono,可以查看官方文档。