变换与变换延迟
transform vs transformDeferred
项目反应堆通量 transform
和 transformDeferred
有什么区别。
好的例子会有帮助。
https://projectreactor.io/docs/core/release/reference/index.html#advanced-mutualizing-operator-usage
大多数时候,Flux
是“惰性”的:您 声明了一个处理管道,但数据只有在您 订阅后才开始流动 去吧。您可以多次订阅。
这称为 cold Flux
(每次您订阅冷源时,该源都会重新生成其数据以供新订阅者使用) .
所以我们可以区分:
- 组装时间:我们在
Flux
实例上调用运算符的时刻,返回一个新的 Flux
实例
- 订阅时间:订阅该实例的时刻。实际上,时刻(复数),因为可能有多个订阅可能相距很远。
transform
是一种将一组运算符应用于给定 Flux
的便捷方法。例如,您希望服务方法返回的所有 Flux
使用 .log("serviceName")
,因此您将此特征外化为 static Function<Flux, Flux>
:
loggingTrait = f -> f.log("serviceName");`
现在您可以通过 transform
.
在服务的所有 Flux-returning 方法中应用此特征
它会立即应用,就在组装时。由于订阅者紧随其后,因此他们都“共享”该函数的相同结果。
现在假设您想要记录到例如。包括订阅时间,或更依赖于每个订阅者的另一条数据。
这就是 transformDeferred
的用武之地:它 将 Function
的应用推迟到订阅发生的那一刻。另外,它为每个订阅应用 Function
。
所以你可以这样做:
loggingTrait = f -> f.log(serviceName + "@" + System.currentTimeMillis());
每个订阅者的日志类别都不同。
项目反应堆通量 transform
和 transformDeferred
有什么区别。
好的例子会有帮助。
https://projectreactor.io/docs/core/release/reference/index.html#advanced-mutualizing-operator-usage
大多数时候,Flux
是“惰性”的:您 声明了一个处理管道,但数据只有在您 订阅后才开始流动 去吧。您可以多次订阅。
这称为 cold Flux
(每次您订阅冷源时,该源都会重新生成其数据以供新订阅者使用) .
所以我们可以区分:
- 组装时间:我们在
Flux
实例上调用运算符的时刻,返回一个新的Flux
实例 - 订阅时间:订阅该实例的时刻。实际上,时刻(复数),因为可能有多个订阅可能相距很远。
transform
是一种将一组运算符应用于给定 Flux
的便捷方法。例如,您希望服务方法返回的所有 Flux
使用 .log("serviceName")
,因此您将此特征外化为 static Function<Flux, Flux>
:
loggingTrait = f -> f.log("serviceName");`
现在您可以通过 transform
.
它会立即应用,就在组装时。由于订阅者紧随其后,因此他们都“共享”该函数的相同结果。
现在假设您想要记录到例如。包括订阅时间,或更依赖于每个订阅者的另一条数据。
这就是 transformDeferred
的用武之地:它 将 Function
的应用推迟到订阅发生的那一刻。另外,它为每个订阅应用 Function
。
所以你可以这样做:
loggingTrait = f -> f.log(serviceName + "@" + System.currentTimeMillis());
每个订阅者的日志类别都不同。