如何将数据沿反应链传递

voy*_*ris 5 project-reactor

每当我需要将数据传递到反应链时,我最终都会做这样的事情:

public Mono<String> doFooAndPassDtoAsMono(Dto dto) {
    return Mono.just(dto)
        .flatMap(dtoMono -> {
            Mono<String> result = // remote call returning a Mono
            return Mono.zip(Mono.just(dtoMono), result);
        })
        .flatMap(tup2 -> {
            return doSomething(tup2.getT1().getFoo(), tup2.getT2()); // do something that requires foo and result and returns a Mono
        });
}
Run Code Online (Sandbox Code Playgroud)

给定以下示例 Dto 类:

class Dto {
    private String foo;

    public String getFoo() {
        return this.foo;
    }
}
Run Code Online (Sandbox Code Playgroud)

因为一直压缩数据以将其传递到链上(尤其是向下几个级别)通常会很乏味,我想知道是否可以简单地直接引用,dto如下所示:

public Mono<String> doFooAndReferenceParam(Dto dto) {
       Mono<String> result = // remote call returning a Mono
        return result.flatMap(result -> {
            return doSomething(dto.getFoo(), result); // do something that requires foo and result and returns a Mono
        });
}
Run Code Online (Sandbox Code Playgroud)

我对第二种方法的担忧是,假设订阅者在线程池上订阅了这个 Mono,我是否需要保证 Dto 是线程安全的(上面的例子很简单,因为它只携带 a,String但如果不是的话怎么办)?

另外,哪一种被认为是“最佳实践”?

Vik*_*wat 0

根据您分享的内容,您可以简单地执行以下操作:

public Mono<String> doFooAndPassDtoAsMono(Dto dto) {
    return Mono.just(dto.getFoo());
}
Run Code Online (Sandbox Code Playgroud)

您在第一个选项中使用 zip 的方式无法解决任何目的。同样,第二个选项也不起作用,因为一旦单声道为空,则不会触发下一个平面地图。