我正在尝试从几个表中进行选择并将其结果放在一个Object中。我想这样做,因为那些是字典,我想在启动时全部。
这就是我现在所拥有的:
控制器:
def getDictionaries = Action.async { implicit request =>
Future.successful(Ok(Json.toJson(dictionaryService.getDictionaries)))
}
DictionaryService:
override def getDictionaries : Dictionaries = {
val currencies: Future[Seq[Currency]] = dictionaryDao.getCurrencies
val propertyTypes: Future[Seq[PropertyType]] = dictionaryDao.getPropertyTypes
Dictionaries(
currencies.result(Duration(10L, TimeUnit.SECONDS)),
propertyTypes.result(Duration(10L, TimeUnit.SECONDS))
)
}
DictionaryDAO:
override def getCurrencies: Future[Seq[Currency]] = {
db.run(slickCurrencies.result)
}
... getPropertyTypes ...
字典案例类和伴随对象
case class Dictionaries (currencies: Seq[Currency], propertyTypes: Seq[PropertyType])
object Dictionaries {
implicit val jsonFormat = Json.format[Dictionaries]
}
我对currencies.result(Duration(10L, TimeUnit.SECONDS))
并不感到自豪,但我不确定应该从这个函数中检索什么,以便我可以轻松地将其转换为JSON。此行代码仍然无效,因为编译器告诉我使用Await
对象。
同样对于PropertyType,我需要做与货币相同的事情。
获得所需结果的最佳方法是什么?
我正处于学习阶段,所以我对此并不了解。
LATER EDIT :流程为:request - > getDictionaries - > dictionaryService.getDictionaries - > dictionaryDAO.getCurrencies& PropertyTypes
在我看来,我需要以同步方式获取它们。
这样做的目的是不为每种类型的字典创建请求。如果我有10个词典,我想在一个请求中得到所有词典。
稍后编辑2
这是我的工作示例,看起来不太好:
控制器:
def getDictionaries = Action.async { implicit request =>
dictionaryService.getDictionaries.map {
dictionaries => Ok(Json.toJson(dictionaries))
}
}
DictionaryService:
override def getDictionaries : Future[Dictionaries] = {
dictionaryDao.getCurrencies.flatMap { currencies =>
dictionaryDao.getPropertyTypes.flatMap { propertyTypes =>
Future.successful(Dictionaries(
currencies,
propertyTypes
))
}
}
}
答案 0 :(得分:0)
您的方法getDictionaries
应该返回Future[Dictionaries]
:
override def getDictionaries : Future[Dictionaries] = {
val futureCurrencies = dictionaryDao.getCurrencies
futureCurrencies map { currencies => // currencies is here Seq[Currency]
Dictionaries(
currencies,
List(PropertyType(1, "x"))
)
}
你的控制器方法:
def getDictionaries = Action.async { implicit request =>
val futureDictionaries = dictionaryService.getDictionaries
futureDictionaries map { dictionaries =>
Ok(Json.toJson(dictionaries))
}
}
说明:如果您希望自己的操作真正异步,则必须自下而上使用Future
。您必须了解如何使用map
,flatMap
和for comprehension
来撰写它们。我没有找到任何温和而简短的介绍,你必须自己搜索。基本上,当您map
超过Future
时,您正在改变它(成功)的结果,从而获得另一个Future
。使用flatMap
,您可以对期货进行一些排序,例如:f1
完成时,启动f2
等等。