【问题标题】:How to transform a Mono to a Mono<Void> in case of error发生错误时如何将 Mono 转换为 Mono<Void>
【发布时间】:2019-12-18 09:49:37
【问题描述】:

我正在尝试编写一个方法来做这样的事情

   Mono<A> ma = networkCall(); //this might fail
   Mono<Void> mv  = ma.map( a -> ....)  #some logic to perform with `A`

   return mv;

诀窍是,ma 很可能会失败,然后我只想记录情况并返回一个 Mono&lt;Void&gt;,它完成时没有错误。

查看Mono api,我刚刚找到onErrorResumeonErrorReturn,但两者都会采用返回A(我无法制造)的函数,而我想返回@987654328 @。 我想解决方案很简单,但找不到合适的操作。 那么,如果出现错误,我应该对ma 进行哪些操作才能将其转换为Mono&lt;Void&gt;

【问题讨论】:

    标签: project-reactor


    【解决方案1】:

    我刚刚找到 onErrorResume 或 onErrorReturn 但两者都会采用返回 A 的函数

    onErrorReturn()确实要求你返回一个A,但onErrorResume()只要求你返回一个Mono&lt;A&gt;,它可以是空的。

    所以你可以使用:

    • 如果调用成功,doOnNext() 使用A 执行您的逻辑;
    • doOnError() 在调用不成功时记录您的错误;
    • onErrorResume() 返回一个结果
    • then() 将结果转换为Mono&lt;Void&gt;

    类似:

    networkCall()
            .doOnNext(a -> doSomethingWith(a))
            .doOnError(e -> e.printStackTrace())
            .onErrorResume(e -> Mono.empty())
            .then();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-13
      • 2019-12-17
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多