有人能帮我理解以下几点之间的区别吗?
Mono.defer()
Mono.create()
Mono.just()
如何正确地使用它?
发布于 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
。
发布于 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
// 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()
更可取,即使乍一看它可能并不明显:
provider1.provide1(someData)
// ONLY IF provider1 did not provide the result, assemble another Mono with provider2.provide()
.switchIfEmpty(Mono.defer(() -> provider2.provide2(someData)))
https://stackoverflow.com/questions/56115447
复制相似问题