如何获取第一个成功完成的 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