【问题标题】:Scala: Is Promise redundant?Scala:Promise 是多余的吗?
【发布时间】:2018-04-14 10:03:02
【问题描述】:

一个相关问题:Why do we need both Future and Promise?

如果我正确理解了 Scala Future/Promise API,Future 和 Promise 之间存在一对一的关系,并且可以从 Promise 转到对应的 Future,但反之则不行。

在我目前看到的代码示例中,(异步)任务实现者可能会使用 Promise,但最终返回给客户端的是相应的 Future 以从中读取结果。

这是有道理的,因为作为任务实施者,我不希望客户能够将任务设置为已完成,仅在完成时读取其结果。

因此,Promise 通常被描述为必不可少,因为它是任务实现者更新/写入(仅一次)任务结果的方式,而 Future 是客户端读取结果的方式。

我理解为什么 Promise 可能有用或“可以拥有”作为 Future 的内部实现细节。

但是,将 Promise 作为公共 API 公开给开发人员真的有必要吗?作为任务实现者,我可以在没有 Promise API 的情况下创建所需的 Future,只需 Future.apply

在我传递给Future.apply 的代码块中,我可以决定返回什么作为成功结果,以及何时抛出异常。这相当于我可以用 Promise 做的事情。

在我看来,最初只有 Promise 之类的东西,具有查询 Promise 以获取已委托给 Future 的已完成结果(值/异常)的附加功能。只是后来 Future 被添加到 API 中,但由于某种原因,Promise 一直暴露在外。

所以我的问题是,Promise 中是否有什么是 Future 无法完成的,或者说 Promise 是多余的?

注意:我不是在问 Promise 和 Future 是否是两个不同的概念,它们证明了不同的实体。我在问 Promise 是否提供了 Future 单独无法实现的实用能力。

【问题讨论】:

    标签: scala promise future


    【解决方案1】:

    您可以将Promise 传递给代码的其他部分,并允许它在需要的时间和方式完成Future

    作为任务实施者,我可以在没有 Promise API 的情况下创建所需的 Future,只需通过 Future.apply。

    您可能只想创建Futures。但是其他人需要编写与Futures 配合使用的函数,而他们需要Promise

    【讨论】:

    • "与 Futures 一起使用的函数" - 您是指可能尝试完成 Futures 的函数吗?
    • 不,我的意思是例如Future 组合器:接受Futures 并返回Futures 的函数。你可以在标准库中看到很多,但这并不意味着你不能自己编写。
    • 您的第一句话确实说“将 Promise 传递给代码的其他部分,并允许它在希望的时间和方式完成 Future。”这对我来说听起来确实像“可能试图完成期货的功能”。是的,通常会看到采用 Future 并返回新 Future 的方法。我认为我在标准库中没有看到将 Promise(以及它的 Future)作为参数的方法示例。你有一个例子吗?我看到很多方法接受 Future 作为参数(不是 Promise),但是 AFAIK 这意味着他们不能自己从 Future 中检索 Promise。 ...
    • ... 如果我给某人 A 一个我创建的 Future,然后我让其他人 B 直接访问其相应的 Promise,这对我来说也是一种反模式。所以 B 可以在外部任何时候尝试成为第一个完成 Future 而 A 不知道的事情(只需查看 Future 代码)。 .... 如果 A 和 B 实际上是同一个人,首先,只需给出 Promise 就足够了,其次,如果他们想强制他们的结果,他们可以将其创建为一个新的 Future,所以他们再次没有'不需要承诺。
    • 反过来说:我创建的是Promise,而不是Future。然后我把promise给B,把它对应的Future给A(所以“未来代码”就是promise.future,如果A看代码,他们肯定能知道)。不是B可以“尝试成为第一个完成未来”,而是完成未来的唯一途径:这就是重点。
    【解决方案2】:

    让我们试一试...

    Promise 允许根据外部事件/触发器完成Futures。

    假设您正在使用您发布订单的服务,这些订单需要很长时间才能执行,因此您只能在很久以后才能获得反馈(执行结果)。

    您将如何处理仅使用 Future 的问题?您需要不断地轮询结果(来自Future.apply 正文)。

    使用Promise,您可以等待服务在完成后触发回调。当触发发生时,您可以使用Promise 完成Future。您从Future.apply 主体之外完成Future,这就是我上面所说的外部事件/触发器的意思。

    换句话说,Promise 是从外部完成Future 的安全方法,没有其他方法可以做到这一点:Promise API 是必不可少的。

    【讨论】:

    • @rapt 你是什么意思?
    猜你喜欢
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多