2017-10-05 34 views
0

我想了解scala期貨中的高階函數。我寫了這段代碼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

嗨,我可以知道如何使onComplete阻塞主線程,直到從未來獲取值,而不使用await.result。謝謝 – BigDataScholar

+1

您不能創建'onComplete'塊,因爲它是應用於Future的副作用,它不會返回值。也許我誤解了這個問題? –

相關問題