播放动作异步包装未来

时间:2015-05-08 14:09:22

标签: scala asynchronous playframework-2.0

假设我的控制器中有一个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调用异步吗?

1 个答案:

答案 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
  }