91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Promise怎么使用

發布時間:2021-12-27 15:54:05 來源:億速云 閱讀:195 作者:iii 欄目:互聯網科技

本篇內容主要講解“Promise怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Promise怎么使用”吧!

按照Erik的介紹,我們可以把Promise當作裝載Future對象的郵箱/容器。

可從它的兩個方法簽名體會下,你可以向郵箱里放成功的數據或者失敗的Exception。

def successful[T](result: T): Promise[T]def failed[T](exception: Throwable): Promise[T]

放了值之后,可以調用Promise的future() 得到一個已經完成了的Future。

Promise最核心的就是這個邏輯:你可以通過Promise.future()得到一個Future對象,而future里的計算結果是在什么其它地方(當然一般情況是在其它線程里、回調代碼里)計算好放進去的。

val p = Promise[Int]()val f = p.future
def produce() = Future {  Thread.sleep(500)  p.success(1)  println("Produce done")}
def consume() = Future {  f.foreach(r => println(s"Get $r"))  println(s"Consume done")}
produce()consume()StdIn.readLine("End?\n")

這段代碼打印如下內容,可以看到consume()方法已經執行完了才打印出“Get 1”。

Consume doneEnd?Produce doneGet 1

這個也好理解,foreach只是針對future Success的情況提供了callback機制。需要注意的是Future可以通過onComplete, foreach注冊多個callback,但是這些callback運行先后以及運行所在線程是沒有保證的。這點區別于map、flatMap。

本來想試著用Promise實現 List[Future[T]] 到 Future[List[T]]的轉換,找到foldLeft這種方式。如下:

def sequence[T](fts: List[Future[T]]): Future[List[T]] = {  fts.foldLeft(Future{ List.empty[T]})((acc, ft) => acc.flatMap(ts => ft.map(t => ts :+ t)))}

畫蛇添足地再體驗下promise:

def sequenceByPromise[T](fts: List[Future[T]]): Future[List[T]] = {  val p = Promise[List[T]]()  val result = p.success(List.empty[T]).future
 fts.foldLeft(result)((acc, ft) => acc.flatMap(ts => ft.map(t => ts :+ t)))  result}

下面代碼演示了如何把callback風格代碼轉為Future風格。在Akka actor框架里,如果需要異步的執行代碼并且后面的代碼需要這個異步執行的結果,我們就可以通過Promise把結果封裝到Future里。

trait CallbackBasedApi {  def computeIntAsync(continuation: Try[Int] => Unit): Unit}
trait FutureBasedApi {  def computeIntAsync(): Future[Int]}
def futurize(callbackBasedApi: CallbackBasedApi): FutureBasedApi = {  val p = Promise[Int]()
 // 體會下把“Try=>Unit”當做complete的參數。t => p.complete(t)有沒有種嵌套的感覺?:)  callbackBasedApi.computeIntAsync( t => p.complete(t))
 new FutureBasedApi {    def computeIntAsync() = p.future  }}

到此,相信大家對“Promise怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

公主岭市| 故城县| 灵台县| 郴州市| 昌图县| 白山市| 龙井市| 宜丰县| 松桃| 广安市| 岑溪市| 新郑市| 科技| 柘城县| 武川县| 望谟县| 东港市| 张家界市| 奈曼旗| 肇源县| 巨野县| 留坝县| 沙湾县| 乌苏市| 嘉黎县| 格尔木市| 顺义区| 石泉县| 邻水| 胶南市| 永安市| 库伦旗| 扶风县| 延津县| 大港区| 蒲城县| 福安市| 清河县| 石门县| 濉溪县| 合江县|