【问题标题】:When is it not possible to replace a Promise by Future?什么时候不能用 Future 代替 Promise?
【发布时间】:2014-04-03 16:52:05
【问题描述】:

刚刚读到这个article关于promises,作者使用了下面的例子:

def redeemCampaignPledge(): Future[TaxCut] = {
    val p = Promise[TaxCut]()
    Future {
      println("Starting the new legislative period.")
      Thread.sleep(2000)
      //p.success(TaxCut(20))
      //println("We reduced the taxes! You must reelect us 2018!")
      p.failure(LameExcuse("global economy crisis"))
      println("We didn't fullfil our promises, so what?")
    }
    p.future
}

val taxCutF: Future[TaxCut] = redeemCampaignPledge()
  println("Now they're elected, let's see if they remember their promise.")
  taxCutF.onComplete {
    case Success(TaxCut(reduction)) =>
      println(s"Miracle! Taxes cut by $reduction percent.")
    case Failure(ex) =>
    println(s"They broke the promise again. Because of a ${ex.getMessage}")
  }

我的问题是,我不能摆脱 Promises 并将其重写为:

def redeem(): Future[TaxCut] = Future {
    println("Starting legislative period...!!!!")
    Thread.sleep(2000)

    println("We were successful")
    TaxCut(25)
}

第二个版本缺少什么?我没有完全理解承诺带来的价值。

【问题讨论】:

    标签: scala promise


    【解决方案1】:

    是的,你完全正确。这是一个非常带有 JavaScript Promises 的 common anti pattern(其中,Future 被称为 Promises,Promises 被称为 deferred)。

    基本上,它不是使用期货提供的延续,而是以类似回调的方式围绕它们构建一个新的延续。

    【讨论】:

    • 有趣!我能想到的一个案例是“做一些工作。返回结果。继续工作”,如这个 scala 文档(见第一个例子):docs.scala-lang.org/overviews/core/futures.html#promises 但我无法想象这很常见?或者这也可以用纯期货来实现? (我想你需要两个未来的计算而不是一个)
    • 这也可以用纯期货来实现——为第一个未来做两个延续。在将非未来 API 转换为未来时,Scala 中的 Promise 很有用——例如回调 API 或 Java 线程 API。
    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 2021-11-29
    • 2017-02-20
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多