spring webflux flatmap return mono< void>

nimxete2  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(424)

我有一个用kotlin写的web应用程序。这是一种有点不和谐的聊天。我有一个函数可以做很多事情。该函数本身用于删除用户的帐户,但在执行此操作时,它也会删除他曾经从数据库中注销的消息,他会从数据库中的所有组中删除,并且在他作为管理员的组中会选择一个新的管理员。
这个函数看起来是这样的:

fun deleteAccount(userId: String) : Flux<Void>{
        return groupRepository.findAllByAdmin(userId)
                .flatMap{
                    if(it.users.size<1) groupRepository.deleteById(it._id)
                    it.admin = it.users[0]
                    it.users.remove(userId)
                    groupRepository.save(it)
                }
                .flatMap {
                    messageRepository.deleteMessageByUserId(userId)
                    userRepository.deleteById(userId)
                }

    }

我的存储库如下所示:

@Repository
interface GroupRepository : ReactiveCrudRepository<GroupRequest, String> {

    fun findByName(name: String): Mono<GroupRequest>
    fun existsByName(name: String): Mono<Boolean>
    fun findAllByAdmin(admin:String) : Flux<GroupRequest>

}

@Repository
interface MessageRepository : ReactiveCrudRepository<Message, String> {

    fun findMessageByGroupId(groupId: String): Flux<Message>
    fun deleteMessageByUserId(userId:String) : Mono<Void>
}

所以函数中的最后两个语句返回一个void mono。问题是,先执行哪条语句并不重要,只执行这两条语句中的一条,我现在尝试了几种方法,包括 Flux.zip 它不完全起作用。如果我将deletemessages放在第一位,那么除了数据库中删除用户的部分之外,其他部分都可以工作。此函数中的问题在哪里?如何修复?

fhity93d

fhity93d1#

我通过压缩第二个平面图中的两个语句来修复它,如下所示:

fun deleteAccount(userId: String) : Flux<Void>{
        return groupRepository.findAllByAdmin(userId)
                .flatMap{
                    if(it.users.size<1) groupRepository.deleteById(it._id)
                    it.admin = it.users[0]
                    it.users.remove(userId)
                    groupRepository.save(it)
                }
                .flatMap {
                    Mono.zip(messageRepository.deleteMessageByUserId(userId),userRepository.deleteById(userId)).map {
                        it.t1
                    }
                }

    }
omjgkv6w

omjgkv6w2#

你可能在找 Mono.when() 如果你只关心完成信号。

相关问题