【发布时间】:2016-11-07 18:51:04
【问题描述】:
假设,我想在未来完成后对结果进行一些验证:
def futureUser() {
val foo = Future(getUserData(userId))
foo.onSuccess {
case None => throw new InvalidUserId(userId)
}
foo // This sucks too btw: why doesn't `onSuccess` return `this` ???
}
这根本不像它看起来的那样:futureUser 返回一个成功的Future 或None,异常被转储到控制台并“swallen”。
看起来这实际上是故意完成的(推特期货的行为方式相同......至少,.onSuccess 是“可链接的”)。为什么?这是什么原因?
更新 好的,我需要提一下,这里使用Option 只是为了举例。请考虑一下:
def futureItems() = Future(getInterestingItems()).map {
case Nil => throw new NothingInterestingFound()
case bar => bar // <-- this is the ugly piece that I could avoid if .onSuccess did not swallow failures
}
【问题讨论】:
-
这就是 API 的设计方式。
onSuccess适合那些想在回调和副作用方面思考/工作的人。如果你想要好的组合组合器,那么也有很多。 -
@TravisBrown 好吧,这就是问题所在,除了非常丑陋的
foo.map { case None => throw ... ; case x => x }之外,实际上似乎没有任何“漂亮的组合器”可用于我的用例:(我错过了吗? -
@TravisBrown @Dima 不是 ScalaZ 的
Task表现得像你想要的那样吗? -
@Dima 为什么不只是
flatMap和Future.failed?一般来说,在这种情况下,无论如何,我都想在结果中去掉Option。 -
@TravisBrown,
Option仅用于示例。在现实生活中还有其他可能性。例如List(请参阅我更新的问题)。