在 return 之前订阅一个 Mono 是个好模式吗?

Is it a good pattern to subscribe a Mono before return it?

我想在 return 之前订阅一个 Mono,订阅者的消费者会做一些工作,比如写一些信息,代码如下所示:

    Mono result = a remote call by WebClient;
    result.subscribe(data->successLog(log,JSON.toJSONString(data)));
    return result;

现在问题来了:

WebClient远程调用会触发两次!

如何订阅 Mono 并在 return 之前做点什么?

不是:)

在 Reactive Streams 中,默认情况下一切都是“惰性”的:您不是在“调用操作”(命令式),而是在构建一个稍后将执行的管道(其中 subscribe() 是触发器处决)。

如果需要在Mono解析成功时登录,可以使用Mono#doOnNext:

return result.doOnNext(data -> successLog(log, JSON.toJSONString(data)));

这样,每次您的 Mono 解决时它都会记录下来。
为什么是“每次”?因为,在 Reactive Streams 中,重新订阅相同的 Mono 是绝对有效的(例如重试)。