-1

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

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()结果准备好。

据我了解,getManagerById()即使结果尚未准备好,上面的代码也会被调用mandatoryComputationToGetManager(),我想等待,这样一旦mandatoryComputationToGetManager()给出结果getManagerById()就应该异步计算。

4

1 回答 1

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");
  }
于 2018-07-01T18:54:36.473 回答