从数据库

时间:2016-06-13 21:14:33

标签: scala playframework slick

我正在尝试从几个表中进行选择并将其结果放在一个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
        ))
      }
    }
  }

1 个答案:

答案 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。您必须了解如何使用mapflatMapfor comprehension来撰写它们。我没有找到任何温和而简短的介绍,你必须自己搜索。基本上,当您map超过Future时,您正在改变它(成功)的结果,从而获得另一个Future。使用flatMap,您可以对期货进行一些排序,例如:f1完成时,启动f2等等。

相关问题