【发布时间】:2018-12-06 20:06:38
【问题描述】:
在非反应性世界中,以下代码 sn-p 没什么特别的:
interface Enhancer {
Result enhance(Result result);
}
Result result = Result.empty();
result = fooEnhancer.enhance(result);
result = barEnhancer.enhance(result);
result = bazEnhancer.enhance(result);
共有三种不同的 Enhancer 实现采用 Result 实例,对其进行增强并返回增强的结果。让我们假设增强器调用的顺序很重要。
现在,如果这些方法被返回 Flux<Result> 的响应式变体替换怎么办?因为方法依赖于前面方法的结果,所以这里不能使用combineLatest。
一个可能的解决方案是:
Flux.just(Result.empty())
.switchMap(result -> first(result)
.switchMap(result -> second(result)
.switchMap(result -> third(result))))
.subscribe(result -> doSomethingWith(result));
请注意,switchMap 调用是嵌套的。因为我们只对最终结果感兴趣,所以我们让switchMap 在前面的通量中发出新事件后立即切换到下一个通量。
现在让我们尝试使用动态数量的通量来实现。非反应性(没有助焊剂),这也没什么特别的:
List<Enhancer> enhancers = <ordered list of different Enhancer impls>;
Result result = Result.empty();
for (Enhancer enhancer : enhancers) {
result = enhancer.enhance(result);
}
但是我如何用三个通量概括上述反应性示例来处理任意数量的通量?
【问题讨论】:
标签: reactive-programming project-reactor