我现在没有直接使用它,但这个问题刚刚出现在我脑海中,无法在网上找到一个好的答案:
我有一个函数'callExactKeyFromDB'返回:[A,Future [A]](A =来自本地内存缓存,Future [A] =查询数据库)。我可以将Future传递给不同的线程/执行上下文并让它们全部注册在'onComplete'上,或者更好的是每次调用此函数时我都会返回一个新的未来,保留已注册的期货列表并在我完成它们之后完成它们可以。
现在问题是我可以用1 Future做到吗?我应该这样做吗?
(想象一下4个进程从数据库请求用户信息并等待它继续)
答案 0 :(得分:0)
我会摆脱Either[A,Future[A]]
并将其转换为Future[A]
开头。
def getUserByKey(key:Int) : Future[User] =
cache.users.contains(key) match {
case true => Future(cache.users(key))
case false => Future(User(key = 101, name = "John Doe")) // db call
}
这会让事情变得更简单,我猜......
如果在上下文之间共享cache
,则一旦保存,就不需要对数据库进行更多调用来获取该特定用户。
def saveUserCache(u:User) : Future[Unit] = Future{
cache.users.contains(u.key) match {
case true => cache.users(u.key) = u
case false => cache.users += (u.key -> u)
}
}
然后人们可以混合这些期货创造其他期货
def renderUser(key:Int) : Future[String] =
for {
user : User <- getUserByKey(key)
update : Unit <- saveUserCache(user)
output : String <- Future(s"${user.key}: ${user.name}")
} yield output
这会回答你的问题吗?
答案 1 :(得分:0)
是的,您可以使用单个Future
注册多个回调。这需要更少的代码,更少的内存,并且更具可读性。