如何获取第一个成功完成的 Future?
How to fetch the first successful completed Future?
问题
我想在期货的帮助下进行两次并行执行。一个查询缓存,另一个查询数据库。调用者应该 return 第一个 成功 完成未来或数据库未来。
import scala.concurrent.{ExecutionContext, Future}
class UserServiceImpl(
private val cacheRepository: CacheRepository,
private val databaseRepository: DatabaseRepository
)(implicit val executionContext: ExecutionContext) extends UserService {
override def getUserByName(username: String): Future[User] = {
val cacheFuture: Future[User] = Future {
cacheRepository.getUser(username)
}
val databaseFuture: Future[User] = Future {
databaseRepository.getUser(username)
}
// now return the first successful finished Future[User] or the databaseFuture if completed.
}
}
看起来 Future.find()
可能就是您想要的。根据 the docs 它 returns,“结果与谓词匹配的第一个 Future”,而且,”...失败期货将被忽略。" 所以你所需要的只是一个谓词,它对任何返回的 User
.
保持 true
例如,如果 User
是一个 String
,那么以下应该有效。
Future.find(List(cacheFuture,databaseFuture))(_.nonEmpty)
请注意,此 returns 一个 Future[Option[User]]
,以防找不到 User
。
问题
我想在期货的帮助下进行两次并行执行。一个查询缓存,另一个查询数据库。调用者应该 return 第一个 成功 完成未来或数据库未来。
import scala.concurrent.{ExecutionContext, Future}
class UserServiceImpl(
private val cacheRepository: CacheRepository,
private val databaseRepository: DatabaseRepository
)(implicit val executionContext: ExecutionContext) extends UserService {
override def getUserByName(username: String): Future[User] = {
val cacheFuture: Future[User] = Future {
cacheRepository.getUser(username)
}
val databaseFuture: Future[User] = Future {
databaseRepository.getUser(username)
}
// now return the first successful finished Future[User] or the databaseFuture if completed.
}
}
看起来 Future.find()
可能就是您想要的。根据 the docs 它 returns,“结果与谓词匹配的第一个 Future”,而且,”...失败期货将被忽略。" 所以你所需要的只是一个谓词,它对任何返回的 User
.
例如,如果 User
是一个 String
,那么以下应该有效。
Future.find(List(cacheFuture,databaseFuture))(_.nonEmpty)
请注意,此 returns 一个 Future[Option[User]]
,以防找不到 User
。