反应流地图运算符永远不会被执行
Reactive streams map operator never getting executed
对于下面的代码
Mono<String> input =
Mono.just("input")
.map {
println "inside map"
it + "added"
}
.transform {
Mono.just("hello")
}
input.subscribe {println it}
控制台如下所示。
16:11:49.056 [main] DEBUG reactor.util.Loggers$LoggerFactory - Using Slf4j logging framework
hello
map
函数中的代码从未执行过。我知道 transform
方法在 assembly time 而不是订阅处执行。
- 为什么 Reactor 决定不处理我的上游
map
运算符。它是否明智地决定,因为我根本没有参考 map
运算符的输出,所以它根本不需要执行 map
?
- 此行为是否可配置?
原因是transform
不会自动订阅你原来的Mono
。将您的逻辑链接到它是您的责任。因为没有人订阅它,所以它永远不会被触发。
由于您发送的示例是假的,所以很难说什么是正确的做法。这取决于您的用例。
不过,您可以做一些事情:
- 摆脱转换,只需使用
then
运算符:
Mono<String> input =
Mono.just("input")
.map {
println "inside map"
it + "added"
}
.then(Mono.just("hello"))
- 如果出于某种原因你需要
transform
,那么将你的逻辑链接到你原来的 Mono:
Mono<String> input =
Mono.just("input")
.map {
println "inside map"
it + "added"
}
.transform {
it.then(Mono.just("hello"))
}
对于下面的代码
Mono<String> input =
Mono.just("input")
.map {
println "inside map"
it + "added"
}
.transform {
Mono.just("hello")
}
input.subscribe {println it}
控制台如下所示。
16:11:49.056 [main] DEBUG reactor.util.Loggers$LoggerFactory - Using Slf4j logging framework
hello
map
函数中的代码从未执行过。我知道 transform
方法在 assembly time 而不是订阅处执行。
- 为什么 Reactor 决定不处理我的上游
map
运算符。它是否明智地决定,因为我根本没有参考map
运算符的输出,所以它根本不需要执行map
? - 此行为是否可配置?
原因是transform
不会自动订阅你原来的Mono
。将您的逻辑链接到它是您的责任。因为没有人订阅它,所以它永远不会被触发。
由于您发送的示例是假的,所以很难说什么是正确的做法。这取决于您的用例。
不过,您可以做一些事情:
- 摆脱转换,只需使用
then
运算符:
Mono<String> input =
Mono.just("input")
.map {
println "inside map"
it + "added"
}
.then(Mono.just("hello"))
- 如果出于某种原因你需要
transform
,那么将你的逻辑链接到你原来的 Mono:
Mono<String> input =
Mono.just("input")
.map {
println "inside map"
it + "added"
}
.transform {
it.then(Mono.just("hello"))
}