[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年。