【发布时间】:2015-03-26 21:48:36
【问题描述】:
我是 Scala 的新手 :(也就是说,我正在与 Play 框架 Action.async 和 Future 调用作斗争。
我想在同一个 Action 中调用 2 个 Futures,然后等到它们都计算后在我的视图中发送它们的结果。
代码如下:
def showPageWithTags(category: String) = Action.async {
val page = PageDAO.findOne(Json.obj("category" -> category)).map {
case Some(page) => {
page.content = page.content.byteArrayToString
}
}
val futureTags = ArticleDAO.listTags
Ok(views.html.web.pages.show(page, futureTags))
}
使用这个定义的函数:
def findOne(id: String): Future[Option[PageModel]]
def listTags: Future[List[String]]
我收到此错误:
[error] found : Some[A]
[error] required: models.PageModel
[error] case Some(page) => {
[error] ^
.../...
[error] found : None.type
[error] required: models.PageModel
[error] case None => {
[error] ^
.../...
[error] found : Option[Nothing]
[error] required: scala.concurrent.Future[play.api.mvc.Result]
[error] optionPage.map {
[error] ^
.../...
[error] found : scala.concurrent.Future[Unit]
[error] required: models.PageModel
[error] Ok(views.html.web.pages.show(optionPage, futureTags))
[error] ^
.../...
[error] found : scala.concurrent.Future[List[String]]
[error] required: List[String]
[error] Ok(views.html.web.pages.show(optionPage, futureTags))
[error] ^
我已经尝试使用 map、for/yield、foreach 来处理 Option 和 Future,但总是会出现这样的错误之一。
在我添加“标签”功能之前,一个 Future 调用运行良好:
def showPage(category: String) = Action.async {
PageDAO.findOne(Json.obj("category" -> category)).map {
case Some(page) => {
page.content = page.content.byteArrayToString
Ok(views.html.web.pages.show(page))
}
case None => {
NotFound
}
}
}
如何在同一个操作中调用 2 个 Futures 并等到它们都计算通过 Ok() 将它们传递给我的页面视图?
非常感谢任何澄清!
【问题讨论】:
标签: scala playframework future