Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactive programming 使用project reactor mergeWith()操作符以实现;if/elseif/else“;分支逻辑_Reactive Programming_Project Reactor - Fatal编程技术网

Reactive programming 使用project reactor mergeWith()操作符以实现;if/elseif/else“;分支逻辑

Reactive programming 使用project reactor mergeWith()操作符以实现;if/elseif/else“;分支逻辑,reactive-programming,project-reactor,Reactive Programming,Project Reactor,我试图使用项目反应器合并操作符,以实现if/elseif/else分支逻辑,如下所述: 提供的示例是用RxJS编写的,但其基本思想保持不变 基本上,我们的想法是在3个monos/publisher上使用filter操作符(因此使用3个不同的谓词),并按如下方式合并3个monos(这里它们当然是RxJS可观测值): 我已复制并粘贴了上述文章中的相关样本 假设something$,betterThings$和defaultThings$是我们的monosisSomething,isBetterThi

我试图使用项目反应器
合并
操作符,以实现
if/elseif/else
分支逻辑,如下所述:

提供的示例是用RxJS编写的,但其基本思想保持不变

基本上,我们的想法是在3个
monos/publisher
上使用
filter
操作符(因此使用3个不同的谓词),并按如下方式合并3个
monos
(这里它们当然是RxJS
可观测值
):

我已复制并粘贴了上述文章中的相关样本

假设
something$
betterThings$
defaultThings$
是我们的monos
isSomething
isBetterThings
是谓词

下面是我的3个real
monos/publishers
(用java编写):

我不知道如何使用
mergeWith()
操作符。。。我尝试了
Mono.when()
静态操作符,它接受多个发布者(对我有好处),但返回一个
Mono
(对我有坏处)

有人能帮忙吗

另外,我相信你会原谅RxJS(js)和反应堆代码(java)的混合。我打算利用我从RxJS学到的知识,在我的反应堆应用程序中实现类似的目标。:-)

编辑1:我尝试了以下方法:

public Mono<ServerResponse> signUpUser(ServerRequest serverRequest) {
    return serverRequest
        .bodyToMono(User.class)
        .flatMap(user -> validateUser(user).or(validateEmailNotExists(user)).or(saveUser(user))).single();
}
编辑3:与单声道相同的错误:

我在这里使用了
concat()
操作符来保留操作顺序

您知道
或()

编辑5:我尝试使用
cache()
操作符,但没有成功:

public Mono<ServerResponse> signUpUser(ServerRequest serverRequest) {
    return serverRequest
        .bodyToMono(User.class)
        .cache()
        .flatMap(user -> validateUser(user)
            .or(validateEmailNotExists(user))
            .or(saveUser(user))
            .single()
        );
}
公共Mono注册用户(服务器请求服务器请求){ 返回服务器请求 .BodyToNo(用户类) .cache() .flatMap(用户->验证用户) .或(validateEmailNotExists(用户)) .或(保存用户(用户)) .single() ); }
您当前的代码示例意味着您返回
Mono
的3个方法应该使用
Mono
而不是
用户
,因此您可能需要在那里更改某些内容

然而,我离题了——这似乎不是这里的主要问题

根据我对该链接中描述的模式的理解,您正在创建3个独立的
Mono
对象,其中只有一个将返回结果-并且您需要原始3个
Mono
对象中返回的任何一个的
Mono

在这种情况下,我建议如下:

Mono<ServerResult> result = Flux.merge(validateUser(user), validateEmailNotExists(user), saveUser(user)).next().single();
这种方法的优点是:

  • 在某些情况下,它可以说更具可读性
  • 如果您的链中可能有多个
    Mono
    返回结果,这允许您设置一个优先顺序来选择一个(与上面的示例相反,在上面的示例中,您只需先获得发出值的
    Mono
    即可)

缺点可能是性能问题。如果
saveUser()
首先在上面的代码中返回一个值,那么您仍然需要等待其他两个
Mono
对象完成,然后组合的
Mono
才能完成。

非常感谢Michael!您能否确认用户是以下代码中的
用户
还是
Mono
Mono result=validateUser(用户)。还是(validateEmailNotExists(用户))..
?另外,如果用户是
用户
平面图
的唯一解决方案?@balteo它完全取决于您的方法是采用
单声道
还是
用户
。至于
flatMap
——这相当于
map
,除此之外,它从另一个发布者那里返回值,而不仅仅是逐字返回值。谢谢。那我上面提到的
NoSuchElementException:Source为空
错误呢?这意味着三个原始
Mono
对象都没有返回任何结果。我建议订阅您认为应该在该场景中返回结果的版本,并找出原因。此处使用
或()。请参阅此回复:了解更多信息。
public Mono<ServerResponse> signUpUser(ServerRequest serverRequest) {
    return serverRequest
        .bodyToMono(User.class)
        .flatMap(user -> validateUser(user).or(validateEmailNotExists(user)).or(saveUser(user))).single();
}
public Mono<ServerResponse> signUpUser(ServerRequest serverRequest) {
    return serverRequest
        .bodyToMono(User.class)
        .flatMap(user -> validateUser(user).or(validateEmailNotExists(user)).or(saveUser(user)).single());
}
public Mono<ServerResponse> signUpUser(ServerRequest serverRequest) {
    Mono<User> userMono = serverRequest.bodyToMono(User.class);
    return validateUser(userMono)
        .or(validateEmailNotExists(userMono))
        .or(saveUser(userMono))
        .single();
}
public Mono<ServerResponse> signUpUser(ServerRequest serverRequest) {
    return serverRequest.bodyToMono(User.class)
        .flatMap(user -> Flux.concat(validateUser(user), validateEmailNotExists(user), saveUser(user)).next().single());
}
public Mono<ServerResponse> signUpUser(ServerRequest serverRequest) {
    return serverRequest
        .bodyToMono(User.class)
        .cache()
        .flatMap(user -> validateUser(user)
            .or(validateEmailNotExists(user))
            .or(saveUser(user))
            .single()
        );
}
Mono<ServerResult> result = Flux.merge(validateUser(user), validateEmailNotExists(user), saveUser(user)).next().single();
Mono<ServerResult> result = validateUser(user).or(validateEmailNotExists(user)).or(saveUser(user)).single();