Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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 Future[Future[T]]到另一个Future中的Future[T]。是否不使用wait映射?_Scala_Asynchronous_Jvm_Scala 2.10 - Fatal编程技术网

Scala Future[Future[T]]到另一个Future中的Future[T]。是否不使用wait映射?

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

这是一个理论问题。我可以调用一个服务来完成一项工作,但该服务可能无法完成所有工作,因此我需要调用第二个服务来完成它

我想知道是否有一种方法可以在不等待的情况下执行类似的操作。resultmap函数中的结果:

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()
}