2016-03-17 38 views
0

我将实现一个关于登录验证的简单方法。验证是POST路线为什么scala方法在逐行序列中不起作用?

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中执行此操作,然后在类型安全激活器中运行该应用程序。

回答

0

未来将在未来得到解决。

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

你必须要么

其他意见:

  • 为什么isSuccess可选(不只是简单的Boolean)?
  • 不要使用var除非你真的必须。一旦知道它,而不是使用临时占位符初始化var,则首选将已解析的值分配给val
  • 避免调用get,更好地处理在数据丢失以及

未经测试的重写的情况:我这样做在Eclipse

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")) 
    } 
} 
+0

,重写没有工作。告诉我一个例外:[type mismatch;发现:scala.concurrent.Future [play.api.mvc.Result] required:play.api.mvc.Result] in okay – jenkin

+0

你使用Action.async吗?该方法不再返回Result,它现在返回一个Future [Result](这将在“validate”完成后解析)。 – Thilo

+0

你需要像AsyncAction这样的东西,并且尽量不要使用Await,只是链接未来并执行转换,关于Future的更多信息请参见http://docs.scala-lang.org/overviews/core/futures.html – Qingwei

相关问题