举这样一个例子:
Mono.create(callback -> {
try { callback.success(someLogic()); }
catch (Exception e) { callback.error(e); }
})
.doFinally((v) -> Mono.fromRunnable(() -> {
Thread.sleep(1000); // In reality, we have a blocking I/O code here and needs to be executed on a separate thread
}).block())
.block();
当我运行此代码时,它立即完成,无需等待 1000 毫秒的延迟。这是因为
doFinally
是一个副作用方法,因此它不会作为链的一部分执行。有没有类似finally的方法可以作为链的一部分执行?
我目前的解决方法是
Mono.create(callback -> {
try { callback.success(someLogic()); }
catch (Exception e) { callback.error(e); }
})
.then(Mono.fromRunnable(() -> {
Thread.sleep(1000);
}))
.onErrorResume(e -> Mono.fromRunnable(() -> {
Thread.sleep(1000);
}))
.block();
如果没有这样的方法还有更好的方法吗?
doOnTerminate()
将在终止前执行副作用。
它没有获得 Mono 值。
doOnNext()
只会使用 Mono 的值来调用,但不会在错误/取消时调用。
tap()
可用于捕获所有可能的信号并在适当时采取行动。
doFinally()
在 Mono 终止后执行。