java多嵌套CompletionStage相当于;平面地图;?
因此,考虑到以下示例:java多嵌套CompletionStage相当于;平面地图;?,java,future,completable-future,Java,Future,Completable Future,因此,考虑到以下示例: CompletionStage<String> tokenFuture = getToken(); CompletionStage<CompletionStage<CompletionStage<CompletionStage<Boolean>>>> result = tokenFuture.thenApply(token -> { WSRequest request = ws.url(url)
CompletionStage<String> tokenFuture = getToken();
CompletionStage<CompletionStage<CompletionStage<CompletionStage<Boolean>>>> result = tokenFuture.thenApply(token -> {
WSRequest request = ws.url(url).setHeader("Authorization", "Bearer " + token);
CompletionStage<WSResponse> response = request.post(json);
return response.thenApply(r -> {
if (r.getStatus() == 201) {
return CompletableFuture.supplyAsync(() -> CompletableFuture.supplyAsync(() -> true));
} else {
return getToken().thenApply(t -> {
WSRequest req = ws.url(url).setHeader("Authorization", "Bearer " + t);
return req.post(json).thenApply(b -> b.getStatus() == 201);
});
}
});
});
CompletionStage-tokenFuture=getToken();
CompletionStage结果=令牌未来。然后应用(令牌->{
WSRequest-request=ws.url(url.setHeader)(“授权”、“承载者”+令牌);
CompletionStage响应=request.post(json);
返回响应。然后应用(r->{
if(r.getStatus()==201){
返回CompletableFuture.supplyAsync(()->CompletableFuture.supplyAsync(()->true));
}否则{
返回getToken()。然后应用(t->{
WSRequest req=ws.url(url.setHeader)(“授权”、“承载者”+t);
返回req.post(json),然后应用(b->b.getStatus()==201);
});
}
});
});
我的问题是整个
CompletionStage
multi-nestedfuture类型。是否可以通过在Scala中使用类似于flatMap
的东西将其简化为CompletionStage
,或者是否有其他方法可以做到这一点?是的,您正在寻找操作:
返回一个新的CompletionStage,当此阶段正常完成时,将使用此阶段作为提供函数的参数执行该阶段
此方法将函数作为参数,该参数获取此完成阶段的结果并返回另一个完成阶段
因此,您可以拥有以下内容:
CompletionStage<String> tokenFuture = getToken();
CompletionStage<Boolean> result = tokenFuture.thenCompose(token -> {
WSRequest request = ws.url(url).setHeader("Authorization", "Bearer " + token);
CompletionStage<WSResponse> response = request.post(json);
return response.thenCompose(r -> {
if (r.getStatus() == 201) {
return CompletableFuture.supplyAsync(() -> true);
} else {
return getToken().thenCompose(t -> {
WSRequest req = ws.url(url).setHeader("Authorization", "Bearer " + t);
return req.post(json).thenApply(b -> b.getStatus() == 201);
});
}
});
});
CompletionStage-tokenFuture=getToken();
CompletionStage结果=令牌未来。然后合成(令牌->{
WSRequest-request=ws.url(url.setHeader)(“授权”、“承载者”+令牌);
CompletionStage响应=request.post(json);
返回响应。然后组合(r->{
if(r.getStatus()==201){
返回CompletableFuture.SupplySync(()->true);
}否则{
返回getToken()。然后组合(t->{
WSRequest req=ws.url(url.setHeader)(“授权”、“承载者”+t);
返回req.post(json),然后应用(b->b.getStatus()==201);
});
}
});
});
应该注意的是,对于Play框架(这是本代码的目的),在注意正确的执行上下文的同时,应该使用thencomposasync()
。