我試圖返回一個CompletableFuture
,它將返回來自Amazon的響應。我的代碼首先檢查是否響應緩存在本地。如果是這樣,它會返回響應,否則會調用亞馬遜。 [注意:真正的版本也會緩存從亞馬遜收到的響應,但我沒有包括,因爲代碼已經非常複雜。]避免複製CompletableFuture的狀態
有沒有辦法改變我的callAmazon
方法的實現方法重新組織代碼),以便我不必「手動」將響應狀態從amazonApi
複製到finalResponse
?我不想直接返回cacheCheck
,因爲我不希望調用者能夠complete()
它。
public CompletableFuture<Response> fetchProductList() {
CompletableFuture<Response> finalResponse = new CompletableFuture<>();
CompletableFuture<Response> cacheCheck = //...
// First, see if we have a cached copy
cacheCheck.whenComplete((response, throwable) -> {
if (throwable == null) {
// Cache hit. Return the cached response
finalResponse.complete(response);
} else {
// Cache miss. Call Amazon
callAmazon(finalResponse);
}
});
return finalResponse;
}
private void callAmazon(CompletableFuture<Response> finalResponse) {
CompletableFuture<Response> amazonApi = //...
amazonApi.whenComplete((response, throwable) -> {
// Copy the state to the `finalResponse`
if (throwable == null) {
finalResponse.complete(response);
} else {
finalResponse.completeExceptionally(throwable);
}
});
}
退房.thenCompose:http://download.java.net/lambda/b88/docs/api/java/util/concurrent/CompletableFuture.html#thenCompose(java.util.function.Function) –
嗨亞歷杭德羅,我試圖想在這種情況下如何使用「組合」,但我無法理解它的工作原理。我不認爲你可以勾畫出一些代碼嗎? –
爲什麼你打擾調用者調用'complete()'?你打算在幾次通話之間分享這個'CompletableFuture'嗎?無論如何,您可以通過返回一個['CompletionStage'](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html)來輕鬆地隱藏該方法(而不是'toCompletableFuture ()'將取消隱藏它)。 –