Java - async thenCompose 内部的同步调用

Java - sync call inside async thenCompose

考虑下面的代码,因为我找不到更好的词来问这个问题:

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

mandatoryComputationToGetManager()returns一个CompletionStage

现在我的疑问是:

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

我知道可以有一种方法,即先调用 thenCompose() 来执行 mandatoryComputationToGetManager(),然后根据 getManagerById() 的先前结果执行另一个 thenCompose()。但是我想弄清楚是否有一种方法可以不通过管道将一个 thenCompose() o/p 传送到另一个我可以一直保持到 mandatoryComputationToGetManager() 结果准备就绪的方法。

据我了解,在上面的代码中 getManagerById() 将被调用,即使 mandatoryComputationToGetManager() 的结果尚未准备好,我想等待一次 [=12] =] 给出结果 getManagerById() 应该异步计算。

理想情况下,我们应该通过管道将一个 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");
  }