使用期货将仅副作用函数转换为异步函数.这是返回类型



我是第一次使用Akka和Scala在真正的项目中工作。在为 DAO 设计接口(将有两个实现:内存和 mongo)时,我遇到了以下疑问。假设我们有一个像这样的 UserRepository 同步版本

trait UserRepository {
  def find(id: Int): Option[User]
  def save(user: User): User
  def delete(user: User): Unit
}

它的异步版本将是这样的:

trait UserRepository {
  def find(id: Int): Future[Option[User]]
  def save(user: User): Future[User]
  def delete(user: User)
}

如何定义删除方法的返回时间?未来[单位]?未来[任何]未来[虚空]?在异步操作中返回的最佳类型是什么,我只关心它的副作用是否成功应用。我没有要返回的内容,但我想知道删除是否已成功完成,或者如果异常能够注册 onFailure 回调。

您应该使用Future[Unit],原因与

在同步情况下使用Unit的原因完全相同 - 您需要返回某些内容,但不需要返回任何内容。 另一方面,Future[Any]的意思是"这里有一些东西,但我不会告诉你它是什么"。我们甚至不要谈论Future[Void]意味着什么。

如果你不想相信我的话,请快速谷歌搜索"Future[Unit]" scala你会发现很多其他人在这种情况下使用它的情况。

你也可以在 Haskell 中使用 IO () 中找到这个成语——其中()是单位类型,IO在某些方面类似于 Scala 的Future——来表示我们只关心副作用的计算。

我为此使用Future[Unit]。通过这种方式,您可以编写期货,放入完整的处理程序并检查错误。

最新更新