2

在 Play2 中,我了解动作组合的概念以及使用 Async {...} 进行异步响应,但我还没有看到将这些方法一起使用的示例。

为了清楚起见,假设您正在使用操作组合来确保用户经过身份验证:

  def index = Authenticated { user =>
   Action { request =>
     Async {
        Ok("Hello " + user.name)      
     }
   }
  }

在 的实现中Authenticated,如果我们假设正在查找这个数据库以检索用户,那么在我看来这部分将是一个阻塞调用,只留下Action正文中的响应是非阻塞的。

有人可以解释我如何进行包含身份验证部分的非阻塞异步 I/O 吗?

4

2 回答 2

0

我可以举一个完整的例子: http: //pastebin.com/McHaqrFv

它的本质是:

  def WithAuthentication(f: WithAuthentication => Result) = Action {
    implicit request => AsyncResult {
      // async auth logic goes here
    }
  }

简单地在控制器中:

  def indexAction = WithAuthentication {
    implicit request =>
      Ok(views.html.index())
  }

甚至:

  def someAction = WithAuthentication {
    implicit request => Async {
      // more async logic here
    }
  }

这是一个模板友好的解决方案,请随意使用。也许有时我会从中创建一个插件。刚刚为我的应用程序编码,到目前为止它似乎工作。

于 2013-05-31T11:01:13.110 回答
0

我的解决方案是由内而外地组合动作,如下所示:

def index = Action { request =>
  Async {
    Authenticated { user =>
      Ok("Hello " + user.name)      
    }
  }
}

然后我的Authenticated签名看起来像:

def Authenticated(body: => Result): Result = {
  // authenticate, and then
  body
}

这里的缺点是正文解析将在身份验证之前进行,这对您来说可能是也可能不是问题。

于 2013-02-10T00:21:47.703 回答