首页 > 解决方案 > 项目反应堆:是否有无副作用的finally方法(不是副作用方法doFinally)

问题描述

给出这样一个例子:

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 like 方法?

我目前的解决方法是

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();

如果没有这样的方法,还有更好的方法吗?

标签: javareactive-programmingspring-webfluxproject-reactor

解决方案


推荐阅读