Scala Future[Future[T]]到另一个Future中的Future[T]。是否不使用wait映射?
这是一个理论问题。我可以调用一个服务来完成一项工作,但该服务可能无法完成所有工作,因此我需要调用第二个服务来完成它 我想知道是否有一种方法可以在不等待的情况下执行类似的操作。resultmap函数中的结果:Scala Future[Future[T]]到另一个Future中的Future[T]。是否不使用wait映射?,scala,asynchronous,jvm,scala-2.10,Scala,Asynchronous,Jvm,Scala 2.10,这是一个理论问题。我可以调用一个服务来完成一项工作,但该服务可能无法完成所有工作,因此我需要调用第二个服务来完成它 我想知道是否有一种方法可以在不等待的情况下执行类似的操作。resultmap函数中的结果: val myFirstFuture = asyncRequestA() myFirstFuture.map(result => { result match { case isWhatIExpected => result case isNo
val myFirstFuture = asyncRequestA()
myFirstFuture.map(result => {
result match {
case isWhatIExpected => result
case isNot => Await.result(asyncRequestB(), someDuration)
}
})
我想将asyncRequestB()
给出的未来“合并”到myFirstFuture
中,而不使用wait函数来获得结果
有什么想法吗?用
flatMap
代替map
:
myFirstFuture.flatMap{ result =>
result match {
case isWhatIExpected => Future.successful( result )
case isNot => asyncRequestB()
}
}
作为旁注,您甚至可以将其缩短如下:
myFirstFuture.flatMap{
case result: isWhatIExpected => Future.successful( result )
case _ => asyncRequestB()
}
另请参见Nikita Volkov的答案,以获取理解使用单子的示例。在Scala中使用单子的标准方法是使用“用于理解”:
感谢非常好的答案以及Scala 2.13以后的版本,使用
Future(Future(123))。flatten
@Jus12:似乎与所问的问题无关
for {
firstResult <- firstFuture
secondResult <- firstResult match {
case isWhatIExpected => Future.successful( firstResult )
case isNot => asyncRequestB()
}
}
yield secondResult
myFirstFuture.flatMap{
case r if isWhatIExpected( r ) => Future.succesful( r )
case r if isNot( r ) => asyncRequestB()
}