我有这样的代码:
CompletableFuture<ApplicationUserDto> byUserName = applicationUserService
.findByUserName(getCurrentApplicationUserName());
CompletableFuture<List<FocusDto>> focuses = focusService.findMine(byUserName.join().getFacilities());
CompletableFuture.allOf(byUserName, focuses).join();
Iterable<IdmDataFacade> facilities = idmService.lookupFacilities(new HashSet<>(byUserName.join().getFacilities())).toIterable();所以在focusService.findMine
我依靠的是
applicationUserService.findByUserName(getCurrentApplicationUserName())
但是在我的前端测试中,所有数据都以正确的方式和方式显示。
我在CompletableFuture上读过关于CompletableFuture方法的文章,所以我测试了以下代码:
CompletableFuture<ApplicationUserDto> byUserName = applicationUserService
.findByUserName(getCurrentApplicationUserName());
CompletableFuture<List<FocusDto>> focuses = byUserName
.thenComposeAsync((result) -> focusService.findMine(result.getFacilities()));
CompletableFuture.allOf(byUserName, focuses).join();
Iterable<IdmDataFacade> facilities = idmService.lookupFacilities(new HashSet<>(byUserName.join().getFacilities())).toIterable();这两个代码段导致完全相同的结果。在日志中,我可以看到正在使用的线程。甚至这些都是平等的。
所以我的问题是:
byUserName完成才能在CompletableFuture中填充参数。发布于 2022-07-28 09:51:01
这就是.join的目的:等待结果准备好并返回它。如果您编写这样的代码:
CompletableFuture<ApplicationUserDto> byUserName = applicationUserService
.findByUserName(getCurrentApplicationUserName());
CompletableFuture<List<FocusDto>> focuses = focusService.findMine(byUserName.join().getFacilities());您正在告诉应用程序阻止执行,并在调用byUserName之前等待findMine完成,这样您就有了.findMine的参数。
这也意味着以后不需要调用.allOf,因为您已经知道byUserName已经完成了。
你可以重写这样的一切:
Iterable<IdmDataFacade> facilities = applicationUserService
.findByUserName(getCurrentApplicationUserName())
.thenCompose(byUserNameResult -> focusService
.findMine(byUserNameResult.getFacilities())
.thenApply(findMineResult -> idmService
.lookupFacilities(new HashSet<>(byUserNameResult.getFacilities())).toIterable()
)
)
.join();谁知道呢?这取决于你在努力实现什么。通常,如果您正在使用.join,那么在每个CompletionStage之后使用它们都是没有意义的。
https://stackoverflow.com/questions/73150449
复制相似问题