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

Vertx Future不会等待

海雪松
2023-03-14

由于我在堆栈中使用Vertx3.1,我想使用这些工具带来的未来特性,但在阅读后,API似乎对我来说相当有限。我甚至找不到方法让未来等待一个可观察的。这里是我的代码

          public Observable<CommitToOrderCommand> validateProductRestrictions(CommitToOrderCommand cmd) {
    Future<Observable<CommitToOrderCommand>> future = Future.future();
    orderRepository.getOrder(cmd, cmd.orderId)
                   .flatMap(order -> validateOrderProducts(cmd, order))
                   .subscribe(map -> checkMapValues(map, future, cmd));
     Observable<CommitToOrderCommand> result = future.result();
    if(errorFound){
        throw MAX_QUANTITY_PRODUCT_EXCEED.create("Fail"/*restrictions.getBulkBuyLimit().getDescription())*/);
    }
    return result;
}

private void checkMapValues(Multimap<String, BigDecimal> totalUnitByRestrictions, Future<Observable<CommitToOrderCommand>> future,
                            CommitToOrderCommand cmd) {
    for (String restrictionName : totalUnitByRestrictions.keySet()) {
        Restrictions restrictions = Restrictions.valueOf(restrictionName);
        if (totalUnitByRestrictions.get(restrictionName)
                                   .stream()
                                   .reduce(BigDecimal.ZERO, BigDecimal::add)
                                   .compareTo(restrictions.getBulkBuyLimit()
                                                          .getMaxQuantity()) == 1) {
            errorFound = true;
        }
    }
    future.complete(Observable.just(cmd));
}

在我第一次观察到的onComplete中,我正在检查结果,在finish之后是当我完成以后解除阻塞的操作。但是我正在寻找未来。结果不会被阻止,直到未来。完成像我期望的那样被调用。而是返回null。

问候。

共有1个答案

单于扬
2023-03-14

vertx future不会阻塞,而是使用在注入结果时调用的处理程序(请参见sethandleriscomplete)。

如果代码的外层需要一个可观察的,您不需要在将来包装它,只需返回Observable 未来 > 没有太大意义,您混合了两种处理异步结果的方法。

请注意,有一些方法可以将一个可观察到的东西折叠成一个未来,但困难在于,一个可观察到的东西可能会发出几个项目,而一个未来只能容纳一个项目。您已经通过将结果收集到单个map发射中来处理这一点。

由于这个可观察的只发出一个项,如果您想要一个future,您应该subscribue,并在onnext方法中调用future.complete(yourMap)。还要定义一个onerror处理程序,它将调用future.fail

 类似资料:
  • 问题内容: 我有这个代码: 发生的是该文件在实际执行之前已删除。 这是因为文件仅包含本机系统调用吗?执行文件 后 如何删除?(我不知道文件的输出是什么,因为它是动态变化的)。 问题答案: 通过使用,您要求在后台启动批处理文件: 因此,您从Java()启动的进程将在后台进程完成之前返回。 删除命令以在前台运行批处理文件-然后,将等待批处理文件完成: 根据OP,重要的是要有可用的控制台窗口-这可以通过

  • 会员等级 点击会员等级进入会员等级界面,可以看到添加会员等级栏、升级规则以及等级信息栏。 升级规则:包括升级标准和说明。 升级标准:指可根据累计积分、累计消费、购买次数这些条件来规定会员的升级。 (注:会员等级按照升级规则的标准进行升级,请慎重选择升级规则。) 点击添加会员等级。进入添加会员等级页面可以看到有基础设置、等级礼包、等级权益。其次再添加各项的信息。 一、基础设置: 1、添加等级名称:设

  • 问题内容: 我有一个代码,其中4个线程同时运行。我想等到所有这4个线程都结束。并且只有在那之后才能继续应用程序流程。 我尝试了两种方法: ,这种方法可以正常工作。之后的代码仅在所有线程完成后才执行。 ,此技术允许执行代码,即使并非所有线程都已完成,也可以执行代码。 代码示例: 我的问题: 为什么并且不要等到所有线程都完成并打印出来 _«我们完成了! 所有线程都完成了!» _刚打完电话? 问题答案:

  • 这个问题与下面的问题类似: 即如何等待进度条消失。 如何在Selenium WebDriver中动态等待进度条完全加载? 我的情况有点不同。在我的场景中,当进度条出现时,所有元素都被禁用。我正在使用显式等待,但仍然得到异常。 方案:在“注册”页中提供所有详细信息后,脚本单击“创建帐户”按钮。此时将出现一个圆形进度条,并持续1或2秒。如果输入的密码无效,则错误消息将显示在注册页面的顶部。我现在需要点

  • 会员等级功能 使用场景 会员等级功能可以实现你的不同会员兑换不同的兑换项,支持对不同等级(或者身份)用户在登录积分商城时的权限控制(目前仅限商品可见性控制或者兑换限制)。 后台配置方法 1.开启会员等级功能 2.设置商品的兑换等级 使用方法 如果需要使用会员等级功能,需要在自动登录url中加入相应额外的参数。 参数 是否必须 参数类型 限制长度 参数说明 uid yes string 255 用户

  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似