Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何获取第一个成功完成的未来? 问题_Scala_Promise_Future - Fatal编程技术网

Scala 如何获取第一个成功完成的未来? 问题

Scala 如何获取第一个成功完成的未来? 问题,scala,promise,future,Scala,Promise,Future,我想在futures的帮助下进行两次平行执行。一个查询缓存,另一个查询数据库。调用者应返回第一个成功的已完成的未来或数据库未来 导入scala.concurrent.{ExecutionContext,Future} 类UserServiceImpl( 专用val cacheRepository:cacheRepository, 专用val数据库存储库:数据库存储库 )(隐式val executionContext:executionContext)扩展用户服务{ 覆盖def getUserB

我想在futures的帮助下进行两次平行执行。一个查询缓存,另一个查询数据库。调用者应返回第一个成功的已完成的未来或数据库未来


导入scala.concurrent.{ExecutionContext,Future}
类UserServiceImpl(
专用val cacheRepository:cacheRepository,
专用val数据库存储库:数据库存储库
)(隐式val executionContext:executionContext)扩展用户服务{
覆盖def getUserByName(用户名:字符串):未来[用户]={
val cacheFuture:Future[用户]=Future{
cacheRepository.getUser(用户名)
}
val数据库未来:未来[用户]=未来{
databaseRepository.getUser(用户名)
}
//现在返回第一个成功完成的Future[User]或数据库Future(如果已完成)。
}
}

它看起来像是
未来。find()
可能就是您想要的。根据它的返回,“结果与谓词匹配的第一个未来”,以及“…失败的未来将被忽略”。因此,您所需要的只是一个谓词,它为任何返回的
用户
保留true

例如,如果
用户
字符串
,那么下面的操作应该有效

Future.find(List(cacheFuture,databaseFuture))(_.nonEmpty)
请注意,如果未找到
用户
,则返回一个
未来[Option[User]]