then 与 Mono<Void> 一起使用时出现意外行为

Unexpected behaviour while using then with Mono<Void>

当使用 .then(Mono<Void>) 组合许多 Mono<Void> 时,它们不会按预期的顺序 运行。

有人可以解释下面的工作代码和非工作代码之间的区别吗?

工作代码

StepVerifier.create(
        repository.incrementCounter(bucket, timeStamp)
                .then(repository.incrementCounter(bucket, timeStamp))
                .then(Mono.just(1).flatMap(t -> repository.resetCounter(bucket, timeStamp)))
                .then(Mono.just(1).flatMap(t -> repository.getCounter(bucket, timeStamp))))
        .expectNext(0L)
        .verifyComplete();

不工作

StepVerifier.create(
        repository.incrementCounter(bucket, timeStamp)
                .then(repository.incrementCounter(bucket, timeStamp))
                .then(repository.resetCounter(bucket, timeStamp))
                .then(repository.getCounter(bucket, timeStamp)))
        .expectNext(0L)
        .verifyComplete();

根据 Gitter channel,您的存储库应该 return 冷 Monos(又名 "lazy"),但您很可能甚至在 return正在处理它。

你可以用Mono.defer让它变冷。