当我提出问题时,我正在实施一些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]
我确信我错过了什么,但我不知道它是什么。我能想到一些亮点吗?
答案 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 []]