Mono/Flos.FromCallable和Mono.Defer之间的差异 [英] Difference between Mono/Flux.fromCallable and Mono.defer
本文介绍了Mono/Flos.FromCallable和Mono.Defer之间的差异的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我通常要求生成一个Mono/Flux,其值将在订阅时生成/计算。对于这一点,来自Callable和Deler运算符似乎都可以。
我看不清javadoc中的区别:
可调用:
来自可调用(可调用供应商)的公共静态单声道
使用提供的Callable创建一个Mono,生成它的值。如果 Callable解析为Null,结果Mono为空。
推迟:
公共静态单色延迟(供应商> 供应商)
创建将提供要订阅的目标Mono的Mono提供程序 用于下游的每个订阅方。
您能解释一下这两项要求是否都可以使用吗?它们之间有什么确切的区别?
推荐答案
Mono.defer
通常在以下情况下使用:您已经拥有来自第三方来源的Mono
,但您希望将其创建延迟到订阅时间,因为在其创建期间会急切地执行某些操作。
考虑以下示例:
public static void main(String[] args)
{
callExternalService()
.repeat(3)
.subscribe();
}
private static Mono<?> callExternalService()
{
System.out.println("External service is called.");
return Mono.just("result");
}
乍一看,您会认为此示例没有问题,但当您检查输出时,您会发现External service is called
只打印了一次,而不是预期的四次(一个原始+三次重复),因为它是在返回的Mono
范围之外执行的。
但是,如果您defer
执行Mono
,它将按预期打印四次:
Mono.defer(() -> callExternalService())
.repeat(3)
.subscribe();
defer
的另一个用例是,当您想要测试重复/重试/重新订阅逻辑,并且希望对返回Mono
的模拟服务有不同的返回值时。
fromCallable
,但主要是在您已经有一个返回Mono
并执行某些紧急操作的方法时使用。如果您完全控制了代码,那么fromCallable
就完全可以了。
这篇关于Mono/Flos.FromCallable和Mono.Defer之间的差异的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文