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 冷 Mono
s(又名 "lazy"),但您很可能甚至在 return正在处理它。
你可以用Mono.defer
让它变冷。
当使用 .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 冷 Mono
s(又名 "lazy"),但您很可能甚至在 return正在处理它。
你可以用Mono.defer
让它变冷。