Java - 在异步内同步调用thenCompose

时间:2018-03-12 13:01:26

标签: java asynchronous completable-future completion-stage

考虑下面的代码,因为我无法找到更好的词来提问:

CompletionStage<Manager> callingAsyncFunction(int developerId) {
    return getManagerIdByDeveloperId(developerId)
           .thenCompose(id ->
             getManagerById(id, mandatoryComputationToGetManager(id)))
}

mandatoryComputationToGetManager()返回CompletionStage

现在我怀疑的是:

我想调用mandatoryComputationToGetManager(),在计算之后我想要调用getManagerById(...)

我知道可以采用一种方式,即首先调用thenCompose() mandatoryComputationToGetManager(),然后针对thenCompose()的上一个结果执行另一个getManagerById()。但是我想弄清楚是否有一种方法没有将thenCompose() o / p交给另一个mandatoryComputationToGetManager() o / p,在getManagerById()结果准备就绪之前我可以保留。

据我了解,在上面的代码mandatoryComputationToGetManager()中,即使结果尚未从mandatoryComputationToGetManager()准备就会被调用,我希望等待getManagerById()给出结果<AndroidKeyStore>false</AndroidKeyStore> 应该异步计算。

1 个答案:

答案 0 :(得分:2)

理想情况下,我们应该将一个thenCompose o / p传递给另一个,但是有一种方法可以实现您要执行的操作。

  CompletionStage<String> callingAsyncFunction(int developerId) {
    return getManagerIdByDeveloperId(developerId)
        .thenCompose(id -> getManagerById(id, mandatoryComputationToGetManager()));
  }

  private CompletionStage<String> getManagerById(
      Integer id, CompletionStage<String> stringCompletionStage) {
    return stringCompletionStage.thenApply(__ -> "test");
  }

  private CompletionStage<String> mandatoryComputationToGetManager() {
    return CompletableFuture.completedFuture("test");
  }