如何获取第一个成功完成的 Future?
Posted
技术标签:
【中文标题】如何获取第一个成功完成的 Future?【英文标题】:How to fetch the first successful completed Future? 【发布时间】:2021-06-02 20:38:19 【问题描述】:问题
我想在期货的帮助下进行两次并行执行。一个查询缓存,另一个查询数据库。调用者应返回第一个成功完成的未来或数据库未来。
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.
【问题讨论】:
【参考方案1】:看起来Future.find()
可能是您想要的。根据the docs,它返回,“结果与谓词匹配的第一个 Future”,并且,“...失败的 Futures 将被忽略。” 所以您只需要一个谓词,该谓词对于任何返回的User
都保持 true。
例如,如果User
是String
,那么以下应该可以工作。
Future.find(List(cacheFuture,databaseFuture))(_.nonEmpty)
请注意,如果没有找到User
,这将返回Future[Option[User]]
。
【讨论】:
以上是关于如何获取第一个成功完成的 Future?的主要内容,如果未能解决你的问题,请参考以下文章