资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

Promise怎么使用

本篇内容主要讲解“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怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


分享文章:Promise怎么使用
分享地址:http://cdkjz.cn/article/pcggjs.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220