如何 return 异步播放动作的结果
How to return result from async play action
我尝试使用 play Framework 开发一个简单的 REST-API,但我坚持以下几点:
我有两种方法:获取一些数据库数据
public CompletionStage<PagedList<Computer>> page(int page, int pageSize, String sortBy, String order, String filter) {
return supplyAsync(() -> {
return ebeanServer.find(Computer.class).where()
.ilike("name", "%" + filter + "%")
.orderBy(sortBy + " " + order)
.fetch("company")
.setFirstRow(page * pageSize)
.setMaxRows(pageSize)
.findPagedList();
} , executionContext);
}
第二个是:Returns数据
public CompletionStage<Result> list(int page, String sortBy, String order, String filter) {
// Run a db operation in another thread (using DatabaseExecutionContext)
return computerRepository.page(page, 10, sortBy, order, filter).thenApplyAsync(list -> {
// This is the HTTP rendering thread context
return ok(views.html.list.render(list, sortBy, order, filter));
}, httpExecutionContext.current());
}
现在我想在 return 向客户端发送数据之前检查一些值:(例如一些 header 值)
public CompletionStage<Result> list(int page, String sortBy, String order, String filter) {
If(x=„somedata“){
// Run a db operation in another thread (using DatabaseExecutionContext)
return computerRepository.page(page, 10, sortBy, order, filter).thenApplyAsync(list -> {
// This is the HTTP rendering thread context
return ok(views.html.list.render(list, sortBy, order, filter));
}, httpExecutionContext.current());
} Else {
Return ok(„value is Not some Data ...“)
}
}
问题是,我无法 return 一个简单的结果...最好的方法是什么?也许也在异步方法中扭曲结果?这是一个好习惯吗?
示例来自这个 github 站点:https://github.com/playframework/play-java-ebean-example
解决方法:
通过 Andriy Kuba 的 awnser,我再次阅读了 CompletableFuture 和 CompletionStage 的 javadoc。这似乎是正确的方法!对于所有想在异步中使用 Play 框架(这非常重要)的人,请查看 https://github.com/playframework/play-java-ebean-example 中的示例并阅读 CompletionStage 的 javadoc (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html) 和 CompletableFuture (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html ).考虑到这一点,编写异步代码非常容易和快乐!
您需要将结果包装在 CompletionStage
中,就像
} Else {
return CompletableFuture.completedFuture(ok("value is Not some Data ..."))
}
我尝试使用 play Framework 开发一个简单的 REST-API,但我坚持以下几点:
我有两种方法:获取一些数据库数据
public CompletionStage<PagedList<Computer>> page(int page, int pageSize, String sortBy, String order, String filter) {
return supplyAsync(() -> {
return ebeanServer.find(Computer.class).where()
.ilike("name", "%" + filter + "%")
.orderBy(sortBy + " " + order)
.fetch("company")
.setFirstRow(page * pageSize)
.setMaxRows(pageSize)
.findPagedList();
} , executionContext);
}
第二个是:Returns数据
public CompletionStage<Result> list(int page, String sortBy, String order, String filter) {
// Run a db operation in another thread (using DatabaseExecutionContext)
return computerRepository.page(page, 10, sortBy, order, filter).thenApplyAsync(list -> {
// This is the HTTP rendering thread context
return ok(views.html.list.render(list, sortBy, order, filter));
}, httpExecutionContext.current());
}
现在我想在 return 向客户端发送数据之前检查一些值:(例如一些 header 值)
public CompletionStage<Result> list(int page, String sortBy, String order, String filter) {
If(x=„somedata“){
// Run a db operation in another thread (using DatabaseExecutionContext)
return computerRepository.page(page, 10, sortBy, order, filter).thenApplyAsync(list -> {
// This is the HTTP rendering thread context
return ok(views.html.list.render(list, sortBy, order, filter));
}, httpExecutionContext.current());
} Else {
Return ok(„value is Not some Data ...“)
}
}
问题是,我无法 return 一个简单的结果...最好的方法是什么?也许也在异步方法中扭曲结果?这是一个好习惯吗?
示例来自这个 github 站点:https://github.com/playframework/play-java-ebean-example
解决方法: 通过 Andriy Kuba 的 awnser,我再次阅读了 CompletableFuture 和 CompletionStage 的 javadoc。这似乎是正确的方法!对于所有想在异步中使用 Play 框架(这非常重要)的人,请查看 https://github.com/playframework/play-java-ebean-example 中的示例并阅读 CompletionStage 的 javadoc (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html) 和 CompletableFuture (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html ).考虑到这一点,编写异步代码非常容易和快乐!
您需要将结果包装在 CompletionStage
中,就像
} Else {
return CompletableFuture.completedFuture(ok("value is Not some Data ..."))
}