[From] https://colobu.com/2016/02/15/Scala-Async/
在我以前的文章中,我介紹了Scala Future and Promise。Future代表一個異步計算,你可以設置你的回調函數或者利用Await.result等待獲取異步計算的結果,你還可以組合多個future為一個新的future。Promise讓你可以控制是否完成計算還是拋出異常,它的future方法返回一個Future對象,complete、success和failure允許你完成計算。如果想要同步操作,可以使用Await.result等待Future完成或者超時,對於沒有實現Awaitable的代碼塊,可以使用blocking方法實現同步執行。
以上是對上一篇文章的總結。Scala官方還提供了一個Async庫,用來簡化Scala異步操作,盡管這個庫還沒有正式加入到Scala的標准庫中。它是通過Scala macro特性實現的。
async用來標記一塊異步執行的代碼,通常這塊代碼中包含包含一個或者多個await調用。如果沒有await調用,我們用future方法就可以了。
這樣,對於復雜的異步代碼,你不必使用map、flatMap或者回調來實現復雜的多層的調用嵌套。
import ExecutionContext.Implicits.global import scala.async.Async.{async, await} val future = async { val f1 = async { ...; true } val f2 = async { ...; 42 } if (await(f1)) await(f2) else 0 }
比如下面的代碼,我們使用純future實現:
def slowCalcFuture: Future[Int] = { val future1 = slowCalcFuture val future2 = slowCalcFuture def combined: Future[Int] = for { r1 <- future1 r2 <- future2 } yield r1 + r2 }
如果使用async/await, 代碼將得到簡化。
def slowCalcFuture: Future[Int] = async { val future1 = slowCalcFuture val future2 = slowCalcFuture await(future1) + await(future2) }
事實上,這個框架是SIP-22 - Async的參考實現。這個Scala特性提議發布於2013年。
