当前位置: 首页 > 知识库问答 >
问题:

调用第二个Mono而不丢失第一个Mono的结果的最佳方法是什么?

米俊喆
2023-03-14

我有需要与两个反应性依赖项交互的代码——保存到数据库和发布到流,每个都返回Mono实例。在这之后,我需要做更多的处理——所有这些都使用我开始时的原始对象,类似这样:

val myObject = Mono.just(“thing”);
myObject.flatMap(repository::save)
        .flatMap(stream::publish)
        .map(obj -> moreProcessing(obj));

但问题是,repository.save不会返回我感兴趣的对象的Monostream.publish也不会返回。

我可以实现我想要的东西,比如:

myObject.flatMap(obj -> repository.save(obj).then(Mono.just(obj))
        .flatMap(obj -> stream.publish(obj).then(Mono.just(obj))
        .map(obj -> moreProcessing(obj));

i、 e.映射到依赖函数只是为了得到它们的行为,然后再直接映射回来,但这似乎很奇怪-好像我可能缺少了更好的方法来使用API,它没有给出我在类型之间映射的提示,因为这不是我真正使用的flatMap

我也可以选择这样的方式:

myObject.flatMap(obj ->
            repository.save(obj)
                .flatMap(x -> publisher.stream(obj))
                .map(x -> moreProcessing(obj)));

但这似乎也不是一个好方法,因为即使在相对简单的情况下,它也会导致难以维护的代码。

思想?

共有3个答案

娄阳舒
2023-03-14

避免失去任何推荐人的一种方法可能是这样的:

Mono<User> monoUser = userRepository.findByUsername(username)
                                .filter(u -> validatePassword(pass, u.getPassword()));

Mono<Clinic> monoClinic = monoUser.flatMap(u -> clinicRepository.findByUserId(u.getId()));
        
return Mono.zip(monoUser, monoClinic, (u,c) -> proccess(u, c)); 

第一单声道返回用户,第二单声道使用第一单声道返回的用户并返回诊所,返回的单声道(第三单声道)使用第一单声道的输出和第二单声道的输出来创建不同的对象(通过使用用户和诊所的过程方法返回)

邹宏峻
2023-03-14

你试过吗?如果rightGenerator的结果为空(没有下一个信号),它的行为就像您希望的那样,但有一个限制,即它立即完成。因此,您需要返回一个可选,或者使用然后返回开关ifempty

申炳
2023-03-14

我有一个类似的问题,我用下面的代码解决了它。我认为不惜一切代价不要迷失在方法链接中是很重要的。因为创建难以阅读的结构非常容易。

@Test
public void mergeMonos(){
    Mono<String> myObject = Mono.just("my object");
    Mono<String> savedToDB = saveToDb(myObject);
    Mono<String> savedToStream = saveToStream(myObject);


    //if you need to wait for the first two to complete
    Flux.concat(savedToDB, savedToStream, myObject)
            .last()
            .subscribe(System.out::println);

    //if you don't need to wait for the db and stream
    Flux.merge(savedToDB, savedToStream, myObject)
            .last()
            .subscribe(System.out::println);
}

private Mono<String> saveToStream(Mono<String> myObject) {
    return myObject.map(t-> "saved to stream");
}

private Mono<String> saveToDb(Mono<String> myObject) {
    return myObject.map(t-> "saved to db");
}
 类似资料:
  • 好吧,所以我有下面的方法,但我试图摆脱使用。块(),因此尝试实现Mono,但得到错误< code >所需的类型:List 原始代码 我尝试以非阻塞方式重构使用 Mono

  • 问题内容: 在ServiceStack网站上列出,它表明ServiceStack可以在Mono上运行,并且可以: XSP mod_mono FastCgi 安慰 这些不同的配置是什么?Mono上的Web Services首选哪种配置? 问题答案: Linux更新 从v4.5.2版本开始, ServiceStack现在支持.NET Core,它比Mono有了显着的性能和稳定性改进,Mono是从共享的

  • 我的代码是这样构造的- 我正在努力实现这一点: 方法1()返回地址时,我需要使用它并调用方法2()来更新MongoDB文档中的地址。也没有抛出异常。但是我没有看到任何日志在方法2() 代码: 虽然调用了method2(),但MongoDB中的文档更新没有发生。

  • 我是整个Spring反应性网络流量的新手。我的问题很简单。在我的addActions()我试图得到一个单声道通过调用getMONtVal()。这工作罚款。但是我需要得到它的值并更新一个属性(submission.state瓦尔)。然后传递调用CustService.addActions(),返回Mono。可以做到这一点而不使用块()?

  • 问题内容: 我有一个名为test1.py的脚本,该脚本不在模块中。它只包含应在脚本本身运行时执行的代码。没有函数,类,方法等。我有另一个作为服务运行的脚本。我想从作为服务运行的脚本中调用test1.py。 例如: 文件service.py 我知道一种方法是打开文件,读取内容并进行基本评估。我假设有一种更好的方法。或者至少我希望如此。 问题答案: 这样做的通常方法如下。 test1.py servi

  • 我希望表的所有都具有,其被的重写。 结果应该变成: 我可以通过单独的查询获得它,例如: 第二个查询的结果应该合并到第一个查询中,这样:“当第二个表中的boolean为TRUE时,用第一个表覆盖第二个表的结果” role_cap和enduser_cap表中的正确值都应该成为结果的一部分。但是,如果对于相同的user_cap_id,role_cap有FALSE条目,而enduser_cap有TRUE条