使用CompletableFuture进行回调

时间:2016-01-19 12:54:36

标签: java multithreading callback

我试图使用一些字符串创建一个非常简单的回调。 IDE的代码意义在于对异常的未经检查的调用抱怨。任何人都可以给我一个解决方案吗?最后的想法是包装一个网络调用,以便返回承诺的结果,我可以根据需要添加其他功能。

nw /home/myUsername/Documents/myNodeWebkitApps/helloWorld/myApp.nw

3 个答案:

答案 0 :(得分:6)

首先,您的班级MakesANetworkCall实现原始类型Supplier而不是Supplier<String>。这将有效地禁用类型检查并隐藏您所做的所有错误,因此这不是您应该担心的单一警告,因为这不是代码中唯一的错误:

  • 传递给BiConsumer的{​​{1}}应该能够使用whenComplete作为其第二个参数。

  • 传递给Throwable的{​​{1}}应使用Function并返回替代结果。

此外,您正在使用表达式exceptionally作为目标调用Throwable方法,并且您有一个过时的字符串创建表达式static,其中简单常量new CompletableFuture<String>()将做。通常,您似乎总是尝试使用不恰当的方法,即设计用于消耗您不使用的东西的方法,或者用于在没有方法的情况下提供值的方法。考虑一下:

new String("Major Tom reporting!")

这似乎是你的意图。如果您确保"Major Tom reporting!"正确实现CompletableFuture.supplyAsync(new MakesANetworkCall()) .thenAccept(result -> System.out.println(result)) .exceptionally(e -> { e.printStackTrace(); return null;}) .thenRun(()->System.out.println("Last action of all!")); ,则应该在没有任何警告的情况下进行编译。

答案 1 :(得分:3)

您的核心问题是class MakesANetworkCall implements Supplier {。这是使用原始类型,因此隐藏了进一步的问题。将其修复为class MakesANetworkCall implements Supplier<String> {并修复所有后续问题,然后获得:

    CompletableFuture.supplyAsync(new MakesANetworkCall())
            // Not <String, String>
            .whenComplete(new BiConsumer<String, Throwable>() {
                @Override
                public void accept(String result, Throwable t) {
                    System.out.println(result);
                }
            })
            // Not <Exception,Exception>
            .exceptionally(new Function<Throwable, String>() {
                @Override
                public String apply(Throwable t) {
                    t.printStackTrace();
                    // Must return a Streing
                    return t.getMessage();
                }
            }
            ).thenApplyAsync(new Function<String, String>() {
                @Override
                public String apply(String o) {
                    System.out.println("Last action of all!");
                    return null;
                }
            });

答案 2 :(得分:0)

CompletableFuture.exceptionally的声明如下:

public CompletableFuture<T> exceptionally(Function<Throwable, ? extends T> fn);

你传递的是Function<Exception, Exception>,而你应该传递Function<Throwable, String>