我是第一次使用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]
。通过这种方式,您可以编写期货,放入完整的处理程序并检查错误。