真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Promise怎么使用

本篇內(nèi)容主要講解“Promise怎么使用”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Promise怎么使用”吧!

專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)新安免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了超過(guò)千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

按照Erik的介紹,我們可以把Promise當(dāng)作裝載Future對(duì)象的郵箱/容器。

可從它的兩個(gè)方法簽名體會(huì)下,你可以向郵箱里放成功的數(shù)據(jù)或者失敗的Exception。

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

放了值之后,可以調(diào)用Promise的future() 得到一個(gè)已經(jīng)完成了的Future。

Promise最核心的就是這個(gè)邏輯:你可以通過(guò)Promise.future()得到一個(gè)Future對(duì)象,而future里的計(jì)算結(jié)果是在什么其它地方(當(dāng)然一般情況是在其它線程里、回調(diào)代碼里)計(jì)算好放進(jìn)去的。

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")

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

Consume doneEnd?Produce doneGet 1

這個(gè)也好理解,foreach只是針對(duì)future Success的情況提供了callback機(jī)制。需要注意的是Future可以通過(guò)onComplete, foreach注冊(cè)多個(gè)callback,但是這些callback運(yùn)行先后以及運(yùn)行所在線程是沒(méi)有保證的。這點(diǎn)區(qū)別于map、flatMap。

本來(lái)想試著用Promise實(shí)現(xiàn) List[Future[T]] 到 Future[List[T]]的轉(zhuǎn)換,找到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)))}

畫(huà)蛇添足地再體驗(yàn)下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風(fēng)格代碼轉(zhuǎn)為Future風(fēng)格。在Akka actor框架里,如果需要異步的執(zhí)行代碼并且后面的代碼需要這個(gè)異步執(zhí)行的結(jié)果,我們就可以通過(guò)Promise把結(jié)果封裝到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]()
 // 體會(huì)下把“Try=>Unit”當(dāng)做complete的參數(shù)。t => p.complete(t)有沒(méi)有種嵌套的感覺(jué)?:)  callbackBasedApi.computeIntAsync( t => p.complete(t))
 new FutureBasedApi {    def computeIntAsync() = p.future  }}

到此,相信大家對(duì)“Promise怎么使用”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


網(wǎng)站欄目:Promise怎么使用
標(biāo)題路徑:http://weahome.cn/article/pcggjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部