相关问题:Why do we need both Future and Promise?
如果我理解Scala Future / Promise API的权利,Future和Promise之间有一对一的关系,并且可以从承诺到相应的未来,但反之亦然。
在我到目前为止看到的代码示例中,(异步)任务实现者可以使用Promise,但最终返回给客户端的是从相应的Future读取结果。
这是有道理的,因为作为一个任务实现者,我不想让客户端能够将任务设置为已完成,只是在完成任务时读取其结果。
因此,Promise通常被描述为必不可少的,因为它是任务实现者更新/写入(仅一次)任务结果的方式,而Future是客户端读取结果的方式。
我理解为什么Promise可能有用,或者"可以拥有"作为Future的内部实现细节。
但将Promise作为公共API暴露给开发人员真的很重要吗?作为一个任务实现者,我可以在没有Promise API的情况下创建所需的Future,只需Future.apply
。
在我传递给Future.apply
的代码块中,我可以决定作为成功结果返回什么,以及何时抛出异常。这相当于我可以用Promise做的事情。
在我看来,最初只有像Promise这样的东西,还有一个额外的能力来查询Promise的完成结果(值/异常),现在已经委托给Future了。只有后来的Future才被添加到API中,但由于某些原因,Promise一直暴露在外。
所以我的问题是,Prom中有什么必要的东西是Future无法完成的,还是Promise是多余的?
注意:我不是在问Promise和Future是两个不同的概念来证明不同的实体。我在问Promise是否提供了单凭Future而无法实现的实用能力。
答案 0 :(得分:2)
让我们试一试......
Promise
允许根据外部事件/触发器完成Future
。
想象一下,您正在使用您发布订单的服务,这些订单需要很长时间才能执行,因此您只会在稍后获得反馈(执行结果)。
您如何仅使用Future
处理此问题?您需要不断轮询结果(来自Future.apply
正文)。
使用Promise
,您可以等待服务在完成后触发回调。触发发生后,您可以使用Future
完成Promise
。您可以通过外部事件/触发器从Future
机构外部完成Future.apply
,这就是我的意思。
换句话说,Promise
是从外部完成Future
的安全方式,没有其他方法可以做到:Promise
API是必不可少的
答案 1 :(得分:0)
您可以将Promise
传递给代码的其他部分,并允许其在何时以及如何完成Future
时完成。
作为一个任务实现者,我可以在没有Promise API的情况下创建所需的Future,只需使用Future.apply。
您可能只想创建Future
。但是其他人需要编写与Future
一起使用的函数,他们需要Promise
。