2

项目反应堆通量之间的区别是什么transformtransformDeferred

好的例子会有所帮助。

https://projectreactor.io/docs/core/release/reference/index.html#advanced-mutualizing-operator-usage

4

1 回答 1

10

大多数时候, aFlux是“惰性的”:您声明了一个处理管道,但数据只有在您订阅它后才开始流动。您可以订阅多次。

这称为 Flux(每次订阅冷源时,源都会重新生成其数据以使新订阅者受益)。

所以我们可以区分:

  • 组装时间:我们在实例上调用运算符并Flux返回一个新Flux实例的时刻
  • 订阅时间:订阅该实例的时间。实际上,时刻(复数),因为可能有多个订阅可能相距甚远。

transform是一种将一组运算符应用于给定的便捷方法Flux。例如,您希望Flux通过服务的方法返回的所有内容都使用.log("serviceName"),因此您将这个特征外部化在 a 中static Function<Flux, Flux>

loggingTrait = f -> f.log("serviceName");`

现在,您可以在服务的所有返回通量的方法中应用此特征transform

它会在组装时立即应用。由于订阅者紧随其后,他们都“共享”该函数的相同结果。

现在想象一下,您希望将日志记录到例如。包括订阅时间,或者更依赖于每个单独订阅者的另一条数据。

这就是transformDeferred进来的地方:它将应用程序推迟Function到订阅发生的那一刻。另外,它适用Function于每个订阅。

因此,您可以执行以下操作:

loggingTrait = f -> f.log(serviceName + "@" + System.currentTimeMillis());

每个订阅者的日志类别会有所不同。

于 2020-09-10T10:34:48.657 回答