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

Spring WebFlux flatmap返回单字

燕翼
2023-03-14

我有一个用Kotlin写的WebApplication。这是一种有点不和的聊天。我有一个函数,它做几件事。该函数本身用于删除用户的帐户,但是在这样做的同时,它也删除了他从数据库中注销的消息,他将从数据库中的所有组中删除,在他是管理员的组中选择一个新的管理员。

而这个函数看起来确实是这样的:

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>
}

所以我的函数中的最后2个语句返回一个空单声道。问题是先执行哪条语句并不重要,只执行了两条语句中的一条,我现在尝试了几种方法,包括flux.zip,但它并不完全有效。如果我把deleteMessages放在第一位,除了数据库中删除用户的部分外,所有内容都可以工作。这个函数的问题在哪里,我该如何修复它?

共有1个答案

谢承
2023-03-14

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

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
                    }
                }

    }
 类似资料:
  • 问题内容: 更新2: 那么这是它可以获得的最优化的吗? 更新1: 我知道我可以给sql查询增加限制,但是我也想摆脱foreach循环,这是我不应该需要的。 原始问题: 我有以下脚本,由于“ foreach”部分的缘故,它是从数据库返回许多行的良好IMO。 如果我知道我将总是只从数据库中获得1行,该如何优化它。如果我知道我只会从数据库中获得1行,我不明白为什么需要foreach循环,但是我不知道如何

  • 问题内容: 有没有更简洁,有效或简单的pythonic方法来执行以下操作? 编辑: 我实际上发现这比使用operator.mul快一点: 给我 问题答案: 不使用lambda: 更好,更快。使用python 2.7.5 在以下配置中: python 2.7.5的结果 结果:如果用作数据结构,则速度最快(小型阵列为18x,大型阵列为250x) 使用python 3.3.2: python 3更慢吗?

  • 问题内容: 提交表单时,我正在运行此表单检查: 该脚本有效,如果数据== 1,它会警告键已经存在,但是表单仍在提交。我以为如果data == 1则返回false将停止处理表单,但是无论如何它都会继续并添加键,并且弹出键已经存在。如果data == 1,如何阻止表单提交?我什至尝试这样做: 然后删除脚本底部的return true,但是会发生相同的问题。弹出窗口出现,但表单仍得到处理。 问题答案:

  • 问题内容: 例如我有一个功能: 我怎样才能返回AJAX后得到的? 问题答案: 因为请求是异步的,所以您无法返回ajax请求的结果(而同步ajax请求是一个 糟糕的 主意)。 最好的选择是将自己的回调传递给f1 然后,您将像这样致电:

  • 我如何传递我的异常,以便使用者将看到我在单声道中传递的原始异常?希望我的问题很清楚,提前谢谢

  • 我遇到了一个问题,似乎无法使用fxml从javafx中的新表单返回值。 我试图有一个主要的形式,它有4个功能,与游戏的连接4开始游戏,查看玩家,查看游戏,查看玩家游戏 当我启动程序时,会弹出主菜单,然后我想单击“开始游戏”按钮。打开后,将提示输入用户1的信息。然后弹出一个关于玩家信息的新表单。 我遇到的问题是,单击accept按钮后,类中的变量变为null,我尝试通过instance get方法从