假设我的控制器中有一个Action Async块,如下所示:
def myCntr = Action.async { implicit request =>
// Step 1. .... // look up over the network
// Step 2. .... // do a database call
}
将未来的步骤1和步骤2包装起来意味着什么? Action.async足以使myCntr调用异步吗?
答案 0 :(得分:1)
Action.async
不足以使您的代码异步。这是async
的签名(我选择了最简单的重载):
def async(block: => Future[Result]): Action[AnyContent]
由您来提供未来。如果您正在调用阻止代码,则可以像Future { blockingCode() }
一样同时执行它。但是,首选方法是在整个申请过程中使用期货。
一个简单的动作可能如下所示:
def lookup(): Future[Connection] = ???
def query(c: Connection): Future[QueryResult] = ???
def myCntr = Action.async {
for {
conn <- lookup()
result <- query(conn)
} yield NoContent
}