我尝试在游戏框架中组合 CompletionStages,然后返回一个像 ok() 这样的结果。这是我的设置:
AccountDao 有两种方法:
public CompletionStage<Account> getUserByEmail(String email) {
return supplyAsync(() -> ebeanServer.find(Account.class).setUseCache(true).where().eq(EMAIL, email).findOne(), executionContext).thenApply(account -> {
return account;
});
}
public CompletionStage<Void> updateAccount(Account account) throws OptimisticLockException{
return runAsync(() -> {
ebeanServer.update(account);
}, executionContext);
}
然后我让我的控制器执行以下操作:
public CompletionStage<Result> editAccount() {
Map<String, String[]> form_values = request().body().asFormUrlEncoded();
return CompletableFuture.completedFuture(ok());
}
所以现在在操作中我想首先执行 getUserByEmail 然后我想设置一些值并使用 updateAccount 方法更新它。如何在不阻塞播放上下文的情况下结合这两个阶段?我用 thenCompose 和 combine 尝试了不同的设置,但我不明白......
这是我的尝试之一:
public CompletionStage<Result> editAccount() {
Map<String, String[]> form_values = request().body().asFormUrlEncoded();
accountDao.getUserByEmail(session().get("accountEmail")).thenCompose(x -> accountDao.updateAccount(x).thenApplyAsync(account -> {
return ok("Going to save account edits");
}, httpExecutionContext.current()));
return CompletableFuture.completedFuture(ok("Fehler am Ende"));
}
这里的问题是,我无法从以前访问帐户(x),因为我无法将其设置为函数......像这样:
public CompletionStage<Result> editAccount() {
Map<String, String[]> form_values = request().body().asFormUrlEncoded();
accountDao.getUserByEmail(session().get("accountEmail")).thenCompose(x -> {
//Update vars in x and then save to database
accountDao.updateAccount(x);
}.thenApplyAsync(account -> {
return ok("Going to save account edits");
}, httpExecutionContext.current()));
return CompletableFuture.completedFuture(ok("Fehler am Ende"));
}
在这里我得到错误:这个表达式的目标类型必须是一个函数接口并且plays说我必须在函数末尾包含return语句!
我只是不明白...感谢您的帮助!
@Marimuthu Madasamy 这不正是我想要的。在您的 awnser 中,我会更新帐户两次。在 accountDao.updateAccount(account) 和 accountDao.saveAccount(account) 中的 etime;我想要这样的东西:
return accountDao.getUserByEmail("mail").thenCompose(account -> {
account.setName("NewName");
accountDao.save(account);
} .thenApplyAsync(voidInput -> {
return ok("Account saved");
}, httpExecutionContext.current()));
在这种情况下,只更新一次帐户,并且只在 httpExecutionContext 上返回结果