spring-webflux - 元素之间相互依赖的反应式 Mono::zip
问题描述
作为一个简单的例子,我有一个依赖于另一个单声道的单声道。通常我会使用Mono::flatMap
链接发布者。但是我发现 usingMono::zip
也可以。这是“允许的”还是一个好主意或坏主意?为什么?
Mono<String> a = Mono.just("A");
Mono<String> b = Mono.just("B");
Mono<String> c = Mono.just("C");
Mono<String> d = Mono.just("D");
Mono<String> ae = a.flatMap(am->Mono.just(am.concat("E")));
Mono.zip(a, b, c, d, ae).subscribe(System.out::println);
作为一个额外的想法:
Mono<String> monoA = Mono.just("A");
Mono<String> monoB = Mono.just("B");
Mono<String> a = something(monoA);
Mono<String> b = something(monoB);
Mono<String> c = something(monoA);
Mono<String> d = something(monoA);
Mono<String> ae = something(a);
Mono.zip(a, b, c, d, ae).subscribe(System.out::println);
更新:我可以添加一个例程来模拟调用 API 的用例,如下所示:
private Mono<String> getOne() {
System.out.println("Here 1");
return Mono.just("A");
}
然后我可以更改第一行,如下所示
Mono<String> a = Mono.from(getOne()).doOnNext(System.out::println);
这确实表明a
被发射了两次,但只构造了一次。在考虑处理这种情况的“正确”方法时,被排放两次可能是一个很小的代价,如下所示:
Mono<String> a = Mono.from(getOne()).doOnNext(System.out::println);
Mono<String> b = Mono.just("B");
Mono<String> c = Mono.just("C");
Mono<String> d = Mono.just("D");
Mono.zip(a, b, c, d).flatMap(tuple4->{
return Mono.just(tuple4.getT1().concat("E")).map(ae->{
// here I have everything I need
return String.format("[%s,%s,%s,%s,%s]", tuple4.getT1(), tuple4.getT2(), tuple4.getT3(), tuple4.getT4(), ae);
});
}).subscribe(System.out::println);
解决方案
在平面图中,publisher
A 需要完成,直到您可以执行 B,因此它将按顺序执行。
使用 zip 时,publisher
A 或 B 可以第一或第二完成,没关系,直到两者都完成后才会继续。它将并行运行。
您还可以查看该zipWith
功能,这是一种publishers
以串行方式组合的方式。
推荐阅读
- sitefinity - 如何将自定义字段添加到 Sitefinity 小部件?
- uwp - UWP NavigationView 标题与 MenuItem 窗格重叠
- ruby-on-rails - 如何在 rswag 中创建 DELETE 销毁操作?
- python - 如何使用 pywin32 与自定义 Office 插件交互
- android - 如何使用 Android Path API 绘制贝塞尔曲线
- graphql - Graphql ID 解析为字符串,即使它是整数
- xero-api - 是否可以在没有用户交互的情况下访问 Xero API
- node.js - 为什么我的 node.js“shell 脚本”在第二次调用及以后运行速度明显更快?
- jquery - Jquery UI Datepicker可以以与最初保存日期格式不同的格式显示日期吗?
- excel - Excel Vlookup 表数组抛出 NA 错误