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

例如,如果UserString,那么以下应该可以工作。

Future.find(List(cacheFuture,databaseFuture))(_.nonEmpty)

请注意,如果没有找到User,这将返回Future[Option[User]]

【讨论】:

以上是关于如何获取第一个成功完成的 Future?的主要内容,如果未能解决你的问题,请参考以下文章

Future和Promise的分析

如何在 Flutter 中基于 Future 结果构建 Stream?

Future.wait使用

java Future 阻塞

如何获取协程的返回值

如何获取剑道上传成功或完成函数返回的值