如何立即产生一个尝试内部的理解?

时间:2017-04-08 17:29:31

标签: scala playframework

我想知道如何在不调用Future.failed的情况下立即终止for comprehension,而是生成Try[Failure]结果。

示例:

for {
    resultOne <- Future {  Successful("Data")  }
    resultTwo <- Future {
         // Something went wrong here...
         // Instead of calling Future.failed(); 
         // I want to terminate this for-comprehension and return a 
         // Failure() object and bypass the next line
    }
    resultThree <- Future {
         // Something went wrong here...
         // Instead of calling Future.failed(); 
         // I want to terminate this for-comprehension and return a 
         // Failure() object and bypass the next line
    }
    resultFour <- Future {
         // ... Some database call which retuns a Try[]
    }
} yield resultFour

另一个例子

你说我的例子没有并行运行。我想我没有其他选择,但要做到这样吗?

for {
    resultOne <- Future {  Successful("Data")  }
    resultFour <- {
         // ... Some async function which returns a Try 
       }
       .flatMap {
           case Success(resultTwo) => // ... Some async function which returns a Try 
           case Failure(ex) => Future.success(Failure(ex))
       }
       .flatMap {
           case Success(resultTwo) => // ... Some database call which retuns a Try[]
           case Failure(ex) => Future.success(Failure(ex))
       }
    }
} yield resultFour

1 个答案:

答案 0 :(得分:0)

你所拥有的是这种快速失败行为,但并不是并行运行!您需要在理解之外创建Futures以便并行运行它们。

幕后没有任何理解,它是地图/平面地图上的语法糖。所以这不是一件可以整体取消的“事情”。

我认为你想要的是在一个失败时停止其他未来(例如,为了节省资源或在任何一个失败时立即返回)。斯卡拉的期货不支持这一点。 Monix是一个scala库,提供CanceleableFuture,完全支持此用例。