2017-04-06 11 views
0

私はScalaとPlay Frameworkを初めて使うので、何が間違っているのかよく分かりません。 Slick DBコントロール(Play Framework)が提供するFuture [Option [MyType]]を解凍しようとしています。 MyTypeは、コード内のBoundingBoxと呼ばれます。Scalaの将来の[Option [MyType]]を開けよう

def getBoundingBoxByFileName(name: String) = { 
    val selectByName = boundingBoxTableQuery.filter{ boundingBoxTable => 
     boundingBoxTable.name === name 
    } 
    db.run(selectByName.result.headOption) 
    } 

BoundingBoxタイプにproduct_nameというフィールドがあります。このフィールドを取得するには、次の操作を行います。

val boundingBoxFutOpt = BoundingBoxQueryActions.getBoundingBoxByFileName("some_file") 

    val res = for { 
    optBb : Option[db.BoundingBox] <- boundingBoxFutOpt 
    } yield{ 
    for(bb : db.BoundingBox <- optBb) yield { 
     println(s"${bb.product_name}") 
    } 
    } 

このコードは出力に何も表示されませんが、コンパイルエラーはありません。 (bb参照を使用しない)いくつかのランダムなテキストのprintln文を変更すると、それもコンソールには表示されません。私には、printlnステートメントは決して実行されないようです。

この問題については、いくつかの方向性があります。

答えて

2

今後printlnを実行する前にプログラムが終了している可能性があります。私はこれが何をしたいあなたを取得すると思います:

import scala.concurrent.Await 
import scala.concurrent.duration.Duration 

// your code here 

Await.result(res, Duration.Inf) 

は、あなたの上記の例では、スレッドを実行しているが、その後それを実行を終了する機会を与えていません。将来が完了するまで、上記はブロックされます。

ブロックドリブンがコードを別のスレッドで実行する価値を否定するので、プロダクションコードでAwaitを使用しないでください。

+0

ありがとうございます!これはトリックでした – Ivan

関連する問題