【问题标题】:Understanding Scala Futures and Promises理解 Scala 的期货和承诺
【发布时间】:2015-07-17 20:31:45
【问题描述】:

我正在努力理解这个概念。我清楚地了解期货是什么。我对 Promises 有点困惑。下面的代码sn-p:

val p = Promise[Int]() // gives me a DefaultPromise
val f = p.future // gives me the future computation for the Promise p

现在下面两个代码sn-ps有什么区别?

p success { 10 }

val x = Future {
  p success { 10 }
}

我对第一个的理解是,p 成功将完成与该 p 相关的未来计算。该计算是异步的吗?这与使用 Future 块来完成与 Promise p 关联的 Future f 的第二个代码 sn-p 有何不同?

【问题讨论】:

  • 在您的示例中,p success{10}Future(10) 将是等效的。所以Future{ p success { 10 }.future } 就像Future(Future(10))。简而言之,您正在将 Promise 组合成 Future。有一个很好的描述here。你可以把 Promise 想象成一个可以写入的 Future。当你定义 p success {x} 时,你是在说你将要构建一个成功的 Future 并将返回值 x。
  • 承诺是未来的来源。未来是你可以订阅的。承诺指定您如何创建未来。
  • @Carlos:感谢您的描述。 p 成功 {x} 也可能导致失败,这就是我们将 p 成功 {x} 包装在 Future 块中的原因吗?
  • 我向您推荐本教程:[Promises and futures in practice][1] 对于您要求的代码,您可以找到代码的解释:Promise 实例始终链接到正是 Future 的一个实例。如果你在 REPL 中再次调用 Future 的 apply 方法,你确实会注意到返回的 Future 也是一个 Promise [1]:danielwestheide.com/blog/2013/01/16/…
  • @user3102968, 如果你认为有一个计算可能会失败,你可以把它包装在一个 Future 中,以防不需要 Promise。在其他情况下,如果您遇到故障,您可以使用p failure trowable

标签: scala promise future


【解决方案1】:

在您的示例中,您可以考虑等效的 p success { 10 }Future(10)。您只需要从 p 中提取未来即可获得相同的结果。

您可以将 Promises 视为可写的Future,您将在其中定义计算的成功或失败。由于它看起来有点命令式编程,您可能会在非常特殊的情况下使用它们。您可以在 link 中看到其中的一些案例。

【讨论】:

  • p.success { 10 }.future 不等于 Future(10) 吗? p success { 10 } 是一个 Promise.type!
  • 你是对的。您需要使用函数.future 提取promise 的Future 以获得相同的结果。
猜你喜欢
  • 2013-09-28
  • 2012-09-19
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
相关资源
最近更新 更多