2017-10-05 7 views
0

私はスカラ先物の高次関数を理解しようとしています。私はこのコードを書きましたScala Future oncompleteが完了しませんか?

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


object App30 extends App { 

    def getMilk(): String = { 
    val ans = "5 gallons of milk" 
    ans 
    } 
    def getFlour(): String = 
    { 
    val ans= "2 oz of flour" 
    ans 
    } 

    val milkFuture = Future { getMilk() } 
    val flourFuture = Future { getFlour() } 

    val resultFut = { 
    for { 
     milk <- milkFuture 
     flour <- flourFuture 
     result = milk + flour 
    } yield result 
    } 

    resultFut.onComplete{ 

    case Success(answer) => println("The result of getting ingridents is " + answer) 
    case Failure(exception) => println("could not access future value") 
    } 
} 

私の問題は、「取得の結果」という文字列を取得できないことです。デバッガがonCompleteで停止し、成功したケースに進まないことがわかります。

どこが間違っているのか分かりますか?これは愚かな間違いだった場合は、親切にそれを指摘し、その後私はその質問を取り下げます。そうでなければ、新しい概念を理解するためのコンセプトを説明してください。あなたが明示的に未来をブロックする必要が

おかげ

+0

これには、https://stackoverflow.com/q/21188012/1296806など多くの重複があります。関連するご質問https://stackoverflow.com/q/45447679/1296806 –

+0

その他の質問があります副作用が完了していない場合にプロセスが終了します。しかし、私はオフィスにいて、彼らを探すことはできません。 –

答えて

2

、そうでない場合はメインスレッドがその完了前に終了することがあります:

import scala.concurrent.{Await, Future} 
import scala.concurrent.duration._ 

Await.result(resultFut, 5 seconds) 

注このような方法は間違いなく、生産コードで使用すべきではない、それは単にですFutureの出力をテストします。通常は、何か悪いことが起こっていない限り、未来が終わるチャンスがあるバックグラウンドで、無限に実行されるイベントループがあります。

+1

こんにちは、await.resultを使用せずに値を取得するまで、メインスレッドをブロックするonCompleteを作成する方法を知っているかもしれません。 thanks – BigDataScholar

+1

'onComplete'ブロックを作成することはできません。これは、未来に適用される副作用であり、値を返しません。おそらく私はその質問を誤解していますか? –

関連する問題