結合多種期貨進行理解

理解力是執行取決於多種期貨的成功結果的程式碼塊一個緊湊的方式。

f1, f2, f3 三個 Future[String] 分別包含字串 one, two, three

val fCombined = 
    for {
        s1 <- f1
        s2 <- f2
        s3 <- f3
    } yield (s"$s1 - $s2 - $s3")

所有期貨成功完成後,fCombined 將成為包含字串 one - two - threeFuture[String]

請注意,此處假定使用隱式 ExectionContext。

另外,請記住,理解只是 flatMap 方法的一種語法糖 ,因此對於 body 來說,Future 物件構造將消除由期貨包含的程式碼塊的併發執行並導致順序程式碼。你在例子中看到它:

val result1 = for {
  first <- Future {
    Thread.sleep(2000)
    System.currentTimeMillis()
  }
  second <- Future {
    Thread.sleep(1000)
    System.currentTimeMillis()
  }
} yield first - second

val fut1 = Future {
  Thread.sleep(2000)
  System.currentTimeMillis()
}
val fut2 = Future {
  Thread.sleep(1000)
  System.currentTimeMillis()
}
val result2 = for {
  first <- fut1
  second <- fut2
} yield first - second

result1 物件所包含的值將始終為負值,而 result2 將為正值。

有關 for comprehensionyield 的更多詳細資訊,請參閱 http://docs.scala-lang.org/tutorials/FAQ/yield.html