我有很多类似这样的电话。问题是下一个调用完全取决于前一个调用。如果没有任何对话从他们那里获取消息是没有意义的,所以我只想打破这个链条。我用 Holger 的答案阅读了几个主题,但我觉得我仍然没有完全理解这一点。有人可以给我一些基于此代码的示例吗?

public CompletableFuture<Set<Conversation>> fetchConversations(List<Information> data, String sessionId)
{
    return myservice
        .get(prepareRequest(data, sessionId))
        .thenApply(HtmlResponse::getDocument)
        .thenApply(this::extractConversationsFromDocument);
}
public CompletableFuture<Elements> fetchMessagesFromConversation(String Url, String sessionId)
{
    return mySerice
        .get(prepareRequest(url, sessionId))
        .thenApply(HtmlResponse::getDocument)
        .thenApply(this::extractMessageFromConversation);
}

最佳答案

从您的任何链步骤中抛出异常将跳过所有后续步骤:不会调用任何 thenApply() 回调,并且将在发生异常时解决 future 。你可以用它来打破你的链条。例如,考虑以下代码:

public CompletableFuture<Set<Conversation>> fetchConversations(List<Information> data, String sessionId) {
    return myservice
            .get(prepareRequest(data, sessionId))
            .thenApply(HtmlResponse::getDocument)
            .thenApply(value -> {
                if (checkSomeCondition(value))
                    throw new CompletionException(new CustomException("Reason"));
                return value;
            })
            .thenApply(this::extractConversationsFromDocument)
            .exceptionally(e -> {
                // the .thenApply(this::extractConversationsFromDocument) step
                // was not executed
                return Collections.emptySet(); //or null
            });
}

您可以添加一个步骤,在其中检查从上一步返回的值,并根据某些条件抛出异常。

然后在最后一个 .thenApply 之后,您可以添加一个 exceptionally 处理程序并返回一个空的 Setnull 或其他东西作为不成功的结果。

您还可以省略 exceptionally 处理程序。在这种情况下,您必须在链的末尾捕获异常,最后调用 .get() :
try {
    Set<Conversation> conversations = fetchConversations(data, id).get();
} catch (InterruptedException e) {
    // handle the InterruptedException
    e.printStackTrace();
} catch (ExecutionException e) {
    // handle the ExecutionException
    // e.getCause() is your CustomException or any other exception thrown from the chain
}

关于java - 打破 Completable Future 的然后应用链,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48512453/

10-11 01:05