斯卡拉:承诺是多余的吗?

时间:2017-11-02 00:44:43

标签: scala promise future

相关问题: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而无法实现的实用能力。

2 个答案:

答案 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