5

我第一次在使用 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 回调。

4

2 回答 2

10

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

如果您不想相信我的话,请在 Google 上进行快速搜索"Future[Unit]" scala,您会发现很多其他人正是在这种情况下使用它的案例。

您还可以IO ()在 Haskell 中找到这个习惯用法——其中()是单元类型,并且IO在某些方面类似于 Scala 的——来Future表示我们只关心副作用的计算。

于 2013-09-30T15:32:57.460 回答
1

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

于 2013-09-30T15:24:32.173 回答