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

Vertx java-使用compose对代码排序

葛勇锐
2023-03-14

我有一个逻辑,我需要将数据保存在两个表中(一对多)。我在我的Java中创建了两个方法,我正在尝试使用Vertx Future和compose来按顺序实现逻辑。但是我已经走了一半,不明白当第一个未来完成时如何实现compose。我的意思是第一个未来的代码运行anAsyncAction_1(料ToAdd);,记录保存在数据库中,但是现在我如何在compose中调用我的第二个方法

public Future<Void> anAsyncAction_2(final SendToCompanyFromSupplier rawmaterialToAdd, Integer id)
{
    //code to get the id from the first future and save data in the table
}

下面是我的代码

public Future<Void> adddetails(final Supplier materialToAdd)
    {
        final Promise<Void> added = Promise.promise();
        
        Future<Integer> fut1 = anAsyncAction_1(materialToAdd);
        
        LOG.debug(" future.result()  "+fut1.result());
        
        fut1.compose((outcome) -> {
            LOG.debug(" future.result()  "+outcome);
             
        });

        CompositeFuture.all(fut1, fut2).onComplete(ar ->
        {
            System.out.println("BOTH OPERATION COMPLETED!! 1 " + ar.succeeded());
            try
            {
                System.out.println("BOTH OPERATION COMPLETED!! 2 " + ar.result().list());
                added.complete();
                System.out.println("BOTH OPERATION COMPLETED!!");
            } catch (Exception e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        });

        return added.future();

    }

共有1个答案

施梓
2023-03-14

如果您只想编写这两个未来,可以简化实现,而无需使用CompositeFuturePromise

示例代码:

java prettyprint-override">public Future<Void> adddetails(final Object materialToAdd) {
    Object rawMaterialToAdd = new Object();

    return anAsyncAction_1(materialToAdd).compose(i -> anAsyncAction_2(rawMaterialToAdd, i))
                                         .onComplete(ar -> {
                                           if (ar.succeeded()) {
                                             System.out.println("Both operations completed");
                                           } else {
                                             ar.cause()
                                               .printStackTrace();
                                           }
                                         });


  }

  private Future<Integer> anAsyncAction_1(Object materialToAdd) {
    Promise<Integer> promise = Promise.promise();
    Vertx.currentContext()
         .runOnContext(v -> promise.complete(1)); //Async Call. Replace with async DB call 1
    return promise.future();
  }

  public Future<Void> anAsyncAction_2(final Object rawmaterialToAdd, Integer id) {
    Promise<Void> promise = Promise.promise();
    Vertx.currentContext()
         .runOnContext(v -> {
           System.out.println("Id received:" + id);
           promise.complete();
         }); //Async Call. Replace it with the async DB call 2
    return promise.future();
  }

下面是序列

  1. Ansyncation\u 1内的异步DB调用将完成。返回的id将用于完成promise。这个promise将在第一个未来实现
  2. future将使用id触发anAsyncAction\u 2。完成时的异步DB调用2将完成第二个future。在未来第二次完成后,将执行onComplete处理程序
 类似资料:
  • 函数饲养 这就是 组合(compose,以下将称之为组合): var compose = function(f,g) { return function(x) { return f(g(x)); }; }; f 和 g 都是函数,x 是在它们之间通过“管道”传输的值。 组合看起来像是在饲养函数。你就是饲养员,选择两个有特点又遭你喜欢的函数,让它们结合,产下一个崭新的函数。组合的用

  • 源代码排版 所有风格都又丑又难读,自己的除外。几乎人人都这样想。把“自己的除外”拿掉,他们或许是对的… ——Jerry Coffin(论缩排) 使用 UTF-8 作为源文件的编码。 每个缩排层级使用两个空格。不要使用制表符。 # 差 - 四个空格 def some_method do_something end # 好 def some_method do_something end

  • 有没有一种方法可以排序很多列表,而不必写: 每一张单子?当你有很多列表时,这是非常乏味的

  • 本文向大家介绍请使用javascript写出数组快速排序代码相关面试题,主要包含被问及请使用javascript写出数组快速排序代码时的应答技巧和注意事项,需要的朋友参考一下  

  • 本文向大家介绍对arraylist中元素进行排序实例代码,包括了对arraylist中元素进行排序实例代码的使用技巧和注意事项,需要的朋友参考一下 rrayList中的元素进行排序,主要考查的是对util包中的Comparator接口和Collections类的使用。 实现Comparator接口必须实现compare方法,自己可以去看API帮助文档。 创建一个Comparator实例后,用Col

  • 我正在做算法的中期审查,我试图用Java实现所有的伪代码,以便更好地理解算法。但是在堆排序部分,我的代码有一些问题。我的输入数组是 {10,16,4,10,14,7,9,3,2,8,1} 第一个元素只是表示我想要排序的元素的数量。换句话说,需要排序的元素从索引1开始。 我的build max heap输出是:16 14 10 8 7 9 3 2 4 1 堆排序的输出是:1 3 2 4 7 8 9