我想知道如何在不调用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
答案 0 :(得分:0)
你所拥有的是这种快速失败行为,但并不是并行运行!您需要在理解之外创建Futures以便并行运行它们。
幕后没有任何理解,它是地图/平面地图上的语法糖。所以这不是一件可以整体取消的“事情”。
我认为你想要的是在一个失败时停止其他未来(例如,为了节省资源或在任何一个失败时立即返回)。斯卡拉的期货不支持这一点。 Monix是一个scala库,提供CanceleableFuture
,完全支持此用例。