【问题标题】:Get Result from CompositeFuture Vertx从 CompositeFuture Vertx 获取结果
【发布时间】:2021-12-29 14:34:26
【问题描述】:

我最近了解了复合期货。我知道我可以有一个 Futures 列表,当它们都完成时,compositeFuture 处理程序将被调用:

CompositeFuture.all(futures).onComplete(compositeAsync -> {
    if (compositeAsync.succeeded()){
        Future<CompositeFuture> cf = compositeAsync.result();
    } else {
        // at least 1 future failed
    }
});

我的问题是关于这一行:Future&lt;CompositeFuture&gt; cf = compositeAsync.result();

我传递给compositeFuture 的future 是List&lt;Future&lt;Buffer&gt;&gt; 类型,但是result() 返回Future。如何从Future&lt;CompoiteFuture&gt; 中获取Future&lt;Buffer&gt;

我使用以下示例将参数化的期货传入compositeFuture.all(futures);

interface MyCompositeFuture extends CompositeFuture {

    // This is what the regular does, just for example
    /*
    static CompositeFuture all(List<Future> futures) {
        return CompositeFutureImpl.all(futures.toArray(new Future[futures.size()]));
    }
    */

    static <T> CompositeFuture all(List<Future<T>> futures) {
        return CompositeFutureImpl.all(futures.toArray(new Future[futures.size()]));
    }
}

来源:Vert.x java List<Futures> parameterization

【问题讨论】:

    标签: java vert.x


    【解决方案1】:

    您应该得到结果,而不是期货本身:

    CompositeFuture.all(futures).onComplete(compositeAsync -> {
        if (compositeAsync.succeeded()){
            CompositeFuture cf = compositeAsync.result();
            cf.list().forEach(futureResult -> {
                // do something with the result of each future
            });
        } else {
            // at least 1 future failed
        }
    });
    

    请注意CompositeFuture extends Future&lt;CompositeFuture&gt;,这就是您的代码有效的原因。但是在onComplete 里面你应该直接使用它而不是Future&lt;CompositeFuture&gt;

    【讨论】:

    • 谢谢!欣赏!
    猜你喜欢
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多