gpt4 book ai didi

java - 需要解释,带有嵌套 allOf 的 applyAsync 将 CompletionStage 视为已完成

转载 作者:行者123 更新时间:2023-12-02 02:19:41 27 4
gpt4 key购买 nike

在我的应用程序中,我有 3 个 future 调用,这些调用是并行完成的,当收到其中一个调用的响应时,我还有另外 3 个请求,所有这些请求都应该在继续执行代码之前完成,正是 DeferredResult 来自 spring。

过了一段时间,我意识到页面有时会在后 3 个请求完成之前呈现。原始源代码(为简单起见省略逻辑):

public DeferredResult<String> someControllerMethod() {

DeferredResult<String> result = new DeferredResult();

CompletableFuture.allOf(
future1(),
future2(),
future3()
)
.whenComplete((aVoid, throwable) -> result.setResult("something"));

return result;
}

public CompletableFuture<?> future3() {
return someService.asyncCall()
.thenApplyAsync(response -> {
....
return CompletableFuture.allOf(
future4(),
future5(),
future6()
);
}
);
}

使用 thenApplyAsync 有时 DeferredResult 在实际 future 之前完成,而更改为 thenComposeAsync 似乎可以解决问题。有人可以解释一下为什么吗?或者这是我的代码中某处的错误,它不应该这样做?

最佳答案

thenApply[Async]接受计算结果为任意值的函数。一旦返回该值, future 将用该值完成。当函数(就像在代码中一样)返回另一个 future 时,这不会为其添加额外的含义,future 将是结果值,无论是否完成,就像任何其他对象一样。

事实上,你的

public CompletableFuture<Void> future3() {
return someService.asyncCall()
.thenApplyAsync(response -> {
....
return CompletableFuture.allOf(
future4(),
future5(),
future6()
);
}
);
}

该方法甚至无法编译,结果是 CompletableFuture<CompletableFuture<Void>> ,一个结果值是另一个 future 的 future 。不发现错误的唯一方法是使用更广泛的类型,例如CompletableFuture<Object>CompletableFuture<?> ,作为 future3() 的返回类型.

相比之下,thenCompose[Async]期望一个函数能够评估另一个 future ,准确地达到您期望的结果。这是“应用”和“撰写”之间的根本区别。如果您保留具体的CompletableFuture<Void> future3() 的返回类型,编译器已经引导您使用“compose”,因为只有这样才会被接受。

public CompletableFuture<Void> future3() {
return someService.asyncCall()
.thenComposeAsync(response -> {
....
return CompletableFuture.allOf(
future4(),
future5(),
future6()
);
}
);
}

关于java - 需要解释,带有嵌套 allOf 的 applyAsync 将 CompletionStage 视为已完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48706612/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com