transform vs transformDeferred

问题描述

项目反应堆流量中transformtransformDeferred之间的区别是什么。

好的榜样会有所帮助。

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

解决方法

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

这称为 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());

每个用户的日志类别都不同。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...