2017-03-10 6 views
0

Futureというコードスニペットから値を取得しようとしていますが、コードを実行すると、onComplete関数が入力されません。私が間違っていることは何ですか?Scala未来onComplete()を入力していません

私は、それは他の記事で示唆されて以来、同様のマップを使用してみましたが、コメントに拡大する成功

override def findOrCreate(phoneNumber: String, creationReason: String): Future[AvroCustomer] = { 

     //query for customer in db 
     val avroCustomer: Future[AvroCustomer] = customerByPhone(phoneNumber) 

     avroCustomer.onComplete({ 
     case Success(null) => { 
      createUserAndEvent(phoneNumber, creationReason, 1.0) 
     } 

     case Success(customer) => { 
      Future.successful(customer) 
     } 

     case Failure(exception) => { 

     } 
}) 
+0

待っている:

def customerByPhone(s: String) = { ... //Some code db.run(query).map(Option(_)) } 

これは今、あなたがこの方法をチェーンできOption[avroCustomer]を生成これを呼び出すコードで実行を終了しますか?あなたはおそらく '失敗 'を得てそれを無視していますか? – jkinkead

+1

あなたの未来は、実際には非常に長い間完了していないかもしれません。デバッグのために 'Await.result'を試してみてください。 – francoisr

+1

先物は_そこにあります - >ある時点で@jkinkeadが指摘した通りにそれらを待たなければなりません。プログラムの終わりに 'Future'を実行し、それを待たずに結果を見ることはありません。 – sebszyller

答えて

2

回答がありませんでした。このダミープログラムは何も印刷しません。

import scala.concurrent.Future 
import scala.util.{Failure, Success} 
import scala.concurrent.ExecutionContext.Implicits.global 

object Quickie { 
    def main(args: Array[String]): Unit = { 
    val addOneInFuture: Future[Int] = Future(addOne(3)) 

    addOneInFuture.onComplete { 
     case Success(s) => println(s) 
     case Failure(ex) => println(ex.toString) 
     case _ => println("what the hell happened") 
    } 

    } 

    def addOne(x: Int): Int = x + 1 
} 

私は新しいスレッドを起動したが値が、私はシンプルAwaitThreed.sleep(_eternity_)、一体でも別のprintlnを追加し、結果が表示されます。ただし、印刷4.表示されません必要とされることはありませんので、。 ScalaのFuturesについて理解しておくべきことは、それらをコレクションとして構成して扱いたいということです(そのため、for-comprehensionsがあります)。あなたはめったに何かをして印刷したくありません。あなたがいくつかのDBまたは休憩IOを行う場合、あなたはとにかくデータをさらに処理するつもりです。

あなたが読むことができるダニエルウエストヒイドの古いが金のブログシリーズがあります。どちらか試しタイプで、まず、あなたがDB側で例外をキャッチしようとすることができ、(onCompleteのはタイプUnitの方法である)あなたが欲しいものを返さない代わりに、onCompleteのを使用しての芋 http://danielwestheide.com/blog/2013/01/09/the-neophytes-guide-to-scala-part-8-welcome-to-the-future.html

1

、または修復して、あなたのメソッドはOption[AvroCustomer]を返してください。

これは、スカラのオプションのラッパータイプ(null型を使用したScala-tasticな方法)の完全な使用例です。 customerByPhoneが何らかの理由でnullを返す場合は、db関数側でcatchすることができ、オプションの型に変換できます。

すなわち、非常に迅速に、それがNULL可能タイプだ場合:あなたはに `Future`ため

override def findOrCreate(phoneNumber: String, creationReason: String): Future[AvroCustomer] = { 

     //query for customer in db 
     customerByPhone(phoneNumber).flatMap { 
     case Some(customer) => Future.successful(customer) 

     case None => createUserAndEvent(phoneNumber, creationReason, 1.0) //I'm assuming this returns a futures. 
     } 
}  
関連する問題