Mono/Flos.FromCallable和Mono.Defer之间的差异 [英] Difference between Mono/Flux.fromCallable and Mono.defer

查看:13
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆