首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mono.Defer() vs Mono.create() vs Mono.just()?

Mono.Defer() vs Mono.create() vs Mono.just()?
EN

Stack Overflow用户
提问于 2019-05-13 15:25:21
回答 2查看 34.3K关注 0票数 34

有人能帮我理解以下几点之间的区别吗?

  • Mono.defer()
  • Mono.create()
  • Mono.just()

如何正确地使用它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-13 16:55:57

Mono.just(value)是最原始的--一旦您有了一个值,您就可以将它包装到一个Mono中,而订阅者就会得到它。

Mono.defer(monoSupplier)允许您提供提供结果Mono实例的整个表达式。此表达式的计算将推迟到有人订阅。在这个表达式中,您还可以使用像Mono.error(throwable)这样的控制结构来指示错误条件(不能使用Mono.just)。

Mono.create(monoSinkConsumer)是最高级的方法,它使您能够完全控制发出的值。不需要从回调返回Mono实例(如在Mono.defer中),您可以控制MonoSink<T>,它允许您通过MonoSink.success()MonoSink.success(value)MonoSink.error(throwable)方法发出值。反应堆文档包含了一些可能的Mono.create用例的好例子:链接到文档

一般的建议是使用最不强大的抽象来完成这项工作:Mono.just -> Mono.defer -> Mono.create

票数 47
EN

Stack Overflow用户

发布于 2021-11-09 13:11:56

虽然总的来说我同意(并赞扬)@IlyaZinkovich的回答,但我会谨慎对待这个建议

一般的建议是使用最不强大的抽象来完成这项工作:Mono.just -> Mono.defer -> Mono.create

在反应性方法中,特别是如果我们是初学者,很容易忽略哪一个“最不强大的抽象”。除了@IlyaZinkovich之外,我没有说别的,只是描述了一个详细的方面。

这里有一个特定的用例,在这个用例中,更强大的抽象Mono.defer()Mono.just()更好,但乍一看可能是不可见的。

另请参阅:

我们使用switchIfEmpty()作为https://nikeshshetty.medium.com/5-common-mistakes-of-webflux-novices-f8eda0cd6291#:%7E:text=Utilizing%20reactor%20library%20functions%20like%20filter%2C%20switchIfEmpty%2C%20onErrorReturn

代码语言:javascript
运行
复制
// First ask provider1
provider1.provide1(someData)
    // If provider1 did not provide the result, ask the fallback provider provider2
    .switchIfEmpty(provider2.provide2(someData))

public Mono<MyResponse> provide2(MyRequest someData) {
    // The Mono assembly is needed only in some corner cases
    // but in fact it is always happening
    return Mono.just(someData)
        // expensive data processing which might even fail in the assemble time
        .map(...)
        .map(...)
        ...
}

只有当provider2.provide2()不返回任何结果时,provider1.provide1()才接受someData,并且/或provider2.provide2()返回的Mono的方法程序集很昂贵,甚至在错误的数据上被调用时会失败。

在这种情况下,defer()更可取,即使乍一看它可能并不明显:

代码语言:javascript
运行
复制
provider1.provide1(someData)
    // ONLY IF provider1 did not provide the result, assemble another Mono with provider2.provide()
    .switchIfEmpty(Mono.defer(() -> provider2.provide2(someData)))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56115447

复制
相关文章

相似问题

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