为什么scala方法不能在逐行序列中工作?

时间:2016-03-17 05:03:26

标签: scala playframework

我将实现一个关于登录验证的简单方法。 validate是一个POST路由

def validate: play.api.mvc.Action[play.api.mvc.AnyContent] = Action { 
    implicit request ⇒
      var isSuccess: Some[Boolean] = Some(false)
      val data = login_Form.bindFromRequest().get
      models.user.validate(data.name, data.psd).map(ccc =>
        if (ccc) {
          Logger.info("1.1")
          isSuccess = Some(true)
        } else {
          Logger.info("1.2")
          isSuccess = Some(false)
        }
      )
      if (isSuccess.get) {
        Logger.info("2.1")
        Ok(views.html.index.render())
      } else {
        Logger.info("2.2")
        Ok(views.html.login("Login failed"));
      }
}

models.user.validate返回一个Future(布尔值),但它没有让我的想法成真。日志只打印2.2然后无法登录。我不知道我的问题是什么。我在Play2.4,Scala 2.11.7,sbt 0.13.8中执行此操作,并在typesafe Activator中运行该应用程序。

1 个答案:

答案 0 :(得分:0)

未来将在未来得到解决。

因此,您在其上运行的代码(在map中)不会立即执行。

你必须

其他观察:

  • 为什么isSuccess是可选的(不仅仅是一个简单的Boolean)?
  • 除非你真的需要,否则不要使用var。希望在您知道后将解析后的值分配给val,而不是使用临时占位符初始化var
  • 避免调用get,更好地处理数据丢失的情况

未经测试的重写:

def validate = Action.async { implicit request ⇒
  login_Form.bindFromRequest() match {
     case Some(data) => models.user.validate(data.name, data.psd).map(okay =>
      if (okay) {
         Logger.info("1.1")
         Ok(views.html.index.render())
      } else {
         Logger.info("1.2")
         Ok(views.html.login("Login failed"));
      }
    )
    case None =>
       Future.successful(Ok(view.html.login("Invalid form posted"))
  }
}