scala - 什么时候不能用 Future 代替 Promise?

标签 scala promise

正在阅读本文article关于 promise ,作者使用了以下示例:

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

我的问题是,我不能去掉 Promise 并将其重写为:

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

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

第二个版本缺少什么?我没有完全理解 promise 带来的值(value)。

最佳答案

是的,你完全正确。这是一个非常common anti pattern使用 JavaScript Promises(其中,Futures 称为 Promises,Promises 称为 deferred)。

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

关于scala - 什么时候不能用 Future 代替 Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22844109/

相关文章:

scala - Kleisli Arrow with Writer in Scala。为什么不编译?

javascript - 为什么在 ES6 中使用 Promise 时,我的事件监听器在发生一个事件后不会持续?

javascript - 在另一个 Promise 的 .then() 中测试一个 Promise

javascript - 如何将异步函数包装在 Promise 中?

javascript - JavaScript 中 then() 函数的执行

scala - 为什么在 Scala 中定义类型时会得到 "expected class or object definition"?

scala - 为什么构造函数上的隐式转换需要 'this' ?

java - Joda-Time 日期时间 欧洲/柏林夏令时

scala - 多次混合相同特征的规则

javascript - 如何检索 restangular 参数的异步值?