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