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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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_Future - Fatal编程技术网

Scala:有条件地根据一个未来执行另一个未来的最惯用方法?

Scala:有条件地根据一个未来执行另一个未来的最惯用方法?,scala,future,Scala,Future,执行以下操作的最惯用、最简洁的方式是什么:一个未来可能执行,也可能不执行,取决于以前的未来执行,或者取决于以前的未来执行的结果,如: def getItFromHere : Future[Option[Something]] = ... def getItFromThere : Future[Option[Something]] = ... def getIt : Future[Option[Something]] = { for { maybeSomething

执行以下操作的最惯用、最简洁的方式是什么:一个未来可能执行,也可能不执行,取决于以前的未来执行,或者取决于以前的未来执行的结果,如:

def getItFromHere : Future[Option[Something]] = ...

def getItFromThere : Future[Option[Something]] = ...

def getIt : Future[Option[Something]] = {

    for {
        maybeSomething <- getItFromHere
        probablySomething <- maybeSomething.getOrElse(getItFromThere) // Obviously can't be done!!!
    }
    yield probablySomething
}
def getItFromHere:Future[Option[Something]]=。。。
def getItFromThere:Future[Option[Something]]=。。。
def getIt:Future[选项[某物]]={
为了{

如果在缓存中找不到任何项,那么将来可能会失败,然后通过检索将其恢复

// assuming getItFromHere() fails if no item is found
getItFromHere() recoverWith { case _ => getItFromThere() }
或者使用
选项
可以这样做:

getItFromHere() flatMap {
  case Some(x) => Future.successful(Some(x))
  case None => getItFromThere()
}

事实上,你的例子就在这里。你只需要匹配一元合成所期望的未来类型:

for {
     fut <- someFuture
     something <- fut.map(x=>someFuture).getOrElse(someBetterFuture)
} yield something

如果您使用scalaz的OptionT transformer:

def getItFromHere : OptionT[Future,Something] = OptionT(...)

def getItFromThere : OptionT[Future,Something] = OptionT(...)

def getIt : Future[Option[Something]] = (getItFromHere orElse getItFromThere).run

谢谢@drexin。maasg的答案是我想的,但你的答案是正确的,我投了更高的票。一个错误:你应该返回未来。成功(一些(x))
def getItFromHere : OptionT[Future,Something] = OptionT(...)

def getItFromThere : OptionT[Future,Something] = OptionT(...)

def getIt : Future[Option[Something]] = (getItFromHere orElse getItFromThere).run