2016-06-13 8 views
0

私はいくつかのテーブルから選択し、その結果を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 ... 

辞書ケースクラスとC ompanionオブジェクト

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:フローは次のとおりです。要求 - > getDictionaries - > dictionaryService.getDictionaries - > dictionaryDAO.getCurrencies & PropertyTypes

私が同期方法でそれらを取得する必要があるように私には思えます。

この目的は、辞書の種類ごとにリクエストを作成しないことです。私が10の辞書を持っているなら、私は1つの要求でそれらすべてを取得したい。

その後EDIT 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

あなたの方法getDictionariesFuture[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)) 
    } 
} 

EXPLANATION:あなたは、あなたの行動が本当に非同期になりたい場合はFutureのすべての方法をボトムアップ使用する必要があります。mapflatMapfor comprehensionでそれらを構成する方法を学ぶ必要があります。私はそれについての優しくて短い紹介を見つけられなかった、あなた自身でそれを検索しなければならない。基本的には、mapFutureを超えると、それは(成功した)結果に変換され、別のFutureが得られます。 flatMapを使用すると、同様に、先物のいくつかの順序を持​​つことができます:私は、JSONに何かの先物を持つオブジェクトを変換していますので、ときf1終了し、f2などを開始...

+0

は、これは本当に動作します。これは正しく変換されますか?私の理解から、あなたのソリューションは私のディクショナリオブジェクトにいくつかの辞書の将来を保存するように指示しています。 – tzortzik

+0

はい、アクションを実際に非同期にしたい場合は、コントローラに未来を伝播する必要があります。 'currencies.result(Duration(10L、TimeUnit.SECONDS))'あなたのスレッドは実際にブロックされ、将来の終了を待つことになります。 –

+0

私はあなたが私を誤解していると感じています。私のコードを更新しました。少し見てください。 – tzortzik

関連する問題