Play和Scala,键入匹配和成功编译,但我认为这是一个不匹配

时间:2015-07-16 13:58:28

标签: scala types playframework

当我提出问题时,我正在实施一些PlayFramework自定义Actions,让我解释一下:

这是我自定义操作的代码:

object AuthenticatedAction extends ActionBuilder[AuthenticatedRequest] with Controller {
  def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[Result]) = {
    request.session.get("username").fold 
    {
      Future.successful(Forbidden(views.html.forbidden()(request)))
    } {
      username => block(new AuthenticatedRequest(username, request))
    }
  }
}

这是我的控制器操作的代码:

def index = AuthenticatedAction { implicit request =>
  Ok(views.html.index("Your new application is ready."))
}

问题是AuthenticatedAction需要一个返回Future[Result]的函数。

  • invokeBlock[A]...的“禁止”部分,我将结果包装在Future
  • 但在“经过身份验证”的部分中,block函数未返回Future[Result],而是返回Result(请参阅def index)。

上面的代码编译,我看到了所需的页面,但我不明白为什么它的工作原理。此外,如果我将block函数的结果包装在Future中,Intelli IDEA检查器会告诉我“类型不匹配”,指定需要Result而不是Future[Result]

我确信我错过了什么,但我不知道它是什么。我能想到一些亮点吗?

2 个答案:

答案 0 :(得分:1)

如果你想要回到未来,你必须这样做:

def index = AuthenticatedAction.async { implicit request =>
  Future.successful(Ok)
}

如果你查看API(下面的链接),有一个apply方法,它接受一个" =>结果"其中.async方法接受" =>未来[结果]"

https://www.playframework.com/documentation/2.4.x/api/scala/index.html#play.api.mvc.ActionBuilder

答案 1 :(得分:0)

block: (AuthenticatedRequest[A]) => Future[Result]

block是一个函数,它接受(AuthenticatedRequest [A])并返回Future [Result]。

如果你换行块,那么结果类型是Future [Future []]