【问题标题】:Reactive programming反应式编程
【发布时间】:2019-03-16 10:53:55
【问题描述】:

我想从 Mono 中提取对象,然后使用该对象进行其他数据库操作,如何在不使用 block() 的情况下执行此操作?

如下图

  Mono<TemplateBo> templateBoMono = 
  templateRepository.findActiveTemplate(tenantId);

    TemplateBo templateBo=
    templateBoMono.flatMap(bo -> {
        bo.setStatus(TemplateStatusEnum.DEACTIVATED);
        return Mono.just(bo);
    }).flatMap(templateRepository::updateTemplate).block();

    templateVersionRepository.findPublishedByTemplateId(templateBo.getId()).flatMap(version -> {
        version.setStatus(TemplateVersionStatusEnum.MODIFIED);
        return Mono.just(version);
    }).flatMap(templateVersionRepository::updateVersion).subscribe();

我想同时执行这两个操作。

【问题讨论】:

  • 紧急回复
  • 对不起,我是新来的,问这个问题很紧急 4 我
  • 新手也没关系。问题有多紧急并不重要——一个好的问题会得到好的答案。就那么简单。我只是想帮忙。
  • 感谢@Jonathan 编辑

标签: java reactive-programming spring-data-mongodb spring-webflux project-reactor


【解决方案1】:

只需删除 block() 并继续 flatmap 您的发布者

    templateRepository.findActiveTemplate(tenantId)
            .flatMap(bo -> {
                bo.setStatus(TemplateStatusEnum.DEACTIVATED);
                return Mono.just(bo);
            })
            .flatMap(templateRepository::updateTemplate)
            .flatMap(templateBo -> templateVersionRepository.findPublishedByTemplateId(templateBo.getId())
                    .flatMap(version -> {
                        version.setStatus(TemplateVersionStatusEnum.MODIFIED);
                        return Mono.just(version);
                    })
                    .flatMap(templateVersionRepository::updateVersion))
            .subscribe()

【讨论】:

  • 请注意,flatMapsetStatus 是不必要的,可以替换为例如。 .doOnNext(bo -&gt; bo.setStatus(TemplateStatusEnum.DEACTIVATED))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2015-07-25
  • 2020-04-29
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多