首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Mono.defer到Mono.defer的Mono/Flim.From

从Mono.defer到Mono.defer的Mono/Flim.From
EN

Stack Overflow用户
提问于 2020-02-05 14:01:35
回答 1查看 8.1K关注 0票数 13

我通常需要生成一个Mono/Flux,它的值将根据订阅时间来生成/计算。对于这一点,fromCallable和延迟运算符似乎都很好。

我无法清楚地看到javadoc中的区别:

FromCallable:

公共静态Mono fromCallable(可调用供应商)

使用提供的可调用创建一个生成其值的Mono。如果可调用解析为null,则生成的Mono将完成空。

延迟

公共静态单次延迟(Supplier>供应商)

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

你能解释一下这两种要求是否都可以用于这一要求吗?它们之间有什么确切的区别?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-06 10:41:27

Mono.defer通常是在您已经从第三方源获得Mono时使用的,但是您希望将其创建推迟到订阅时间,因为在创建它的过程中会急切地做一些事情。

请考虑以下示例:

代码语言:javascript
运行
复制
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,它将按预期打印四次:

代码语言:javascript
运行
复制
Mono.defer(() -> callExternalService())
    .repeat(3)
    .subscribe();

defer的另一个用例是您想要测试一个重复/重试/重新订阅逻辑,并且您希望对返回Mono的模拟服务有不同的返回值。

总之,它确实非常类似于fromCallable,但大多数是在您已经有了返回Mono并执行一些迫切任务的方法时使用的。如果您对代码有完全的控制,那么您完全可以使用fromCallable

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60077499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档