首页 > 解决方案 > 元素之间相互依赖的反应式 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);

标签: spring-webfluxproject-reactor

解决方案


在平面图中,publisherA 需要完成,直到您可以执行 B,因此它将按顺序执行。

使用 zip 时,publisherA 或 B 可以第一或第二完成,没关系,直到两者都完成后才会继续。它将并行运行。

您还可以查看该zipWith功能,这是一种publishers以串行方式组合的方式。


推荐阅读