[From] https://colobu.com/2016/02/15/Scala-Async/html
在我之前的文章中,我介紹了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
或者回調來實現複雜的多層的調用嵌套。async
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
, 代碼將獲得簡化。spa
def slowCalcFuture: Future[Int] = async { val future1 = slowCalcFuture val future2 = slowCalcFuture await(future1) + await(future2) }
事實上,這個框架是SIP-22 - Async的參考實現。這個Scala特性提議發佈於2013年。scala