Kotlin 从单声道列表中获取第一个onNext信号
假设有3个函数可以生成Kotlin 从单声道列表中获取第一个onNext信号,kotlin,spring-webflux,project-reactor,Kotlin,Spring Webflux,Project Reactor,假设有3个函数可以生成Monos。我试图得到任何一个Monos发射的第一个结果。下面是一个测试来描述我在寻找什么: fun main() { StepVerifier .create(firstElement()) .expectSubscription() .expectNext(3) .expectComplete() .verify() } fun firstElement(): Mono<Int> = Flux.concat(_1
Mono
s。我试图得到任何一个Monos发射的第一个结果。下面是一个测试来描述我在寻找什么:
fun main() {
StepVerifier
.create(firstElement())
.expectSubscription()
.expectNext(3)
.expectComplete()
.verify()
}
fun firstElement(): Mono<Int> = Flux.concat(_1(), _2(), _3(), _4()).next()
fun _1(): Mono<Int> = 1.toMono().delayElement(Duration.ofMillis(1000))
fun _2(): Mono<Int> = Mono.empty()
fun _3(): Mono<Int> = 3.toMono().delayElement(Duration.ofMillis(500))
fun _4(): Mono<Int> = Mono.error(RuntimeException())
fun main(){
步进验证器
.create(firstElement())
.1.1.2(订阅)
.下一步(3)
.expectComplete()
.verify()
}
fun firstElement():Mono=Flux.concat(_1(),_2(),_3(),_4()).next()
fun _1():Mono=1.toMono().delayElement(持续时间.百万(1000))
fun_2():Mono=Mono.empty()
fun_3():Mono=3.toMono().delayElement(持续时间为500毫秒)
fun_4():Mono=Mono.error(RuntimeException())
问题在于firstElement()
,如何生成3
,因为它是第一个发出元素的元素。但是,正如你所看到的,从任何一个Monos:
- 它们中的任何一个都有可能比其他的发射得更快
- 它们中的任何一个都可能发出空的或
onComplete()
- 它们中的任何一个都可能发出错误或
onError()
要求它们全部发出,因为返回值是Mono.zip{…}
Tuple
和Mono.first(…)
传输Flux.first(…).next()
和/或onComplete()
onError()
消除了Flux.concat(…)
和onComplete()
但它仍然根据给定的onError()
发布者的顺序进行顺序订阅
Mono
继续并合并您的函数
private Mono<Integer> firstElement() {
return Flux.merge(
_1().onErrorResume(ignored -> Mono.empty()),
_2().onErrorResume(ignored -> Mono.empty()),
_3().onErrorResume(ignored -> Mono.empty()),
_4().onErrorResume(ignored -> Mono.empty()))
.next();
}
private Mono firstElement(){
返回通量.合并(
_1().OneErrorResume(已忽略->Mono.empty()),
_2().OneErrorResume(已忽略->Mono.empty()),
_3().OneErrorResume(已忽略->Mono.empty()),
_4().onErrorResume(忽略->Mono.empty())
.next();
}
如果出现错误,可以使用空的Mono
恢复并合并您的函数
private Mono<Integer> firstElement() {
return Flux.merge(
_1().onErrorResume(ignored -> Mono.empty()),
_2().onErrorResume(ignored -> Mono.empty()),
_3().onErrorResume(ignored -> Mono.empty()),
_4().onErrorResume(ignored -> Mono.empty()))
.next();
}
private Mono firstElement(){
返回通量.合并(
_1().OneErrorResume(已忽略->Mono.empty()),
_2().OneErrorResume(已忽略->Mono.empty()),
_3().OneErrorResume(已忽略->Mono.empty()),
_4().onErrorResume(忽略->Mono.empty())
.next();
}
这太完美了!我太专注于寻找一个单一的函数来解决这个问题,但像这样一个简单的组合就像一个魅力!这太完美了!我太专注于寻找一个单一的函数来解决这个问题,但像这样一个简单的组合就像一个魅力!