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

如何在反应函数中使用条件和多个步骤

仲孙文乐
2023-03-14

我目前正在使用kotlin quarkus和mutiny构建一个反应式应用程序,作为反应式编程的新手,我想知道处理以下工作流的最佳方式是什么:

  • 尝试在数据库中查找项目(dynamodb)
  • 如果存在,则向调用者返回一个指示此的值
  • 如果不存在,请调用保存服务
  • 致电外部服务获取一些数据
  • 使用来自外部服务的数据更新数据库中的项目
  • 返回一个值,指示已创建对象

以下是我目前的代码:

fun createCard(creationOrder: CreationOrder): Uni<CardCreationResult> {
    return creationOrdersRepository.findByOrderId(creationOrder.orderId)
        .onItem().transform {item ->
            if (item != null) {
                CardCreationResult.AlreadyCreated
            } else {
                creationOrdersRepository.save(creationOrder)

                //TODO external webservice call
                
                val cardNumber = UUID.randomUUID().toString()
                creationOrdersRepository.updateCardNumberAndStatus(externalServiceCallResult)
                CardCreationResult.Created
            }
        }
}

此方法最终将由restendpoint调用。

creationOrdersRepository.savecreationOrdersRepository.updateCardNumberAndstatus返回一个CompletableFuture(我正在使用夸克斯亚马逊发电机客户端)。

这是正确的方法吗?我应该在Uni中包装保存和更新CardNumberAndstatus结果(我一直在尝试,但一直收到类型错误)?

共有1个答案

公羊兴文
2023-03-14

我不相信你的代码能达到你的期望。如果我理解正确,您需要在发布结果之前“保存”和“更新”。因此,您需要这样的东西(在Java中,因为我的Kotlin不太好):

return creationOrdersRepository.findByOrderId(creationOrder.orderId)
  // We will be returning a Uni as the save, update and the web service are 
  // async
  .onItem().transformToUni(item -> {
    if (item != null) {
      return Uni.createFrom().item(CardCreationResult.AlreadyCreated);
    } else {
      // Create an Uni from the save operation
      Uni<Void> save = Uni.createFrom().completionStage(() -> 
        creationOrdersRepository.save(creationOrder));
      // This uni represents the invocation of the remote service
      Uni<String> webService = callWebService();

      // we chain the operations save -> web service -> update -> Created
      return save
        .chain(webService)
        .chain(externalServiceCallResult -> 
          Uni.createFrom().completionStage(() -> creationOrdersRepository
                  .updateCardNumberAndStatus(externalServiceCallResult)
        )        
        .replaceWith(CardCreationResult.Created);
    }
 类似资料:
  • 我有一个以下格式的csv文件,第一列是id,第二列是name,第三列是Dept,这个文件有700K多行。我试图通过使用SQL Loader在oracle表中只移动部门10、90、30和70的详细信息。 请帮帮我。如何在控制文件中使用多个条件

  • 问题内容: 我想使用生成器yield和async函数。我阅读了本主题,并编写了以下代码: 但是我得到了错误: 语法错误:异步函数中的“ yield” 如何在异步功能中使用良率生成器? 问题答案: 更新: 从Python 3.6开始,我们有了异步生成器,能够直接在协程内部使用。 Python 3.5的旧答案: 您不能在协程内部。唯一的方法是使用/ magic方法手动实现异步迭代器。在您的情况下: 输

  • 我有一个接受NSE参数的函数。 假设我有一个tibble,其中有一列需要订购。我想创建一个函数,它可以根据函数参数中输入的名称对列名进行排序。但是,如果我不使用参数,我希望它不对列进行排序,因此我使用< code>column_name = NULL作为默认参数(或< code>column_name = NA) 创建于 2022-04-11 由 reprex 软件包 (v2.0.1) 然而,尽管

  • 我目前在R中有一个数据框,看起来像这样 我用group_by将数据按动物分组。我想创建一个新的列V6,它采用列V4,将较低的值除以较高的值,如果该值小于0.5,则V6= A,ifelse则V6 = b..有没有办法在R中使用带条件语句的mutate函数?实际的数据框要大得多,所以我宁愿不用手动操作。这是我希望最终数据框的样子 这就是我开始做的 但我知道这是不对的。非常感谢。

  • 问题内容: 有什么方法可以使用html属性调用多个JavaScript函数吗? 问题答案: onclick=”doSomething();doSomethingElse();” 但实际上,最好不要使用Java,而是通过Javascript代码将事件处理程序附加到DOM节点。这被称为不引人注目的javascript。

  • 在我的项目中,当我只需单击主页上的“加入房间”按钮时,它会将我指向特定的房间。以房间号为例;它发生在xPOgk21523aqPW上,它通过一个像localhost:3000/room/xPOgk21523aqPW这样的扩展来实现。当我进行重定向时,我所在组件的名称是Player。我想要的是,当我将Homapage.js重定向到Player.js时,能够使用Player.js中的代码“xPOgk21