【发布时间】: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。