Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 从单声道列表中获取第一个onNext信号_Kotlin_Spring Webflux_Project Reactor - Fatal编程技术网

Kotlin 从单声道列表中获取第一个onNext信号

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

假设有3个函数可以生成
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();
}

这太完美了!我太专注于寻找一个单一的函数来解决这个问题,但像这样一个简单的组合就像一个魅力!这太完美了!我太专注于寻找一个单一的函数来解决这个问题,但像这样一个简单的组合就像一个魅力!