完成失败的未来的这两种方式之间有什么区别吗?如果是这样,哪种方式被认为更正确"?
致电Promise.failure:
def functionThatFinishesLater: Future[String] = {
val myPromise = Promise[String]
Future {
// Do something that might fail
if (failed) {
myPromise.failure(new RuntimeException("message")) // complete with throwable
} else {
myPromise.success("yay!")
}
} (aDifferentExecutionContext)
myPromise.future
}
或者只是抛出异常
def functionThatFinishesLater: Future[String] = {
val myPromise = Promise[String]
Future {
// Do something that might fail
if (failed) {
throw new RuntimeException("message") // throw the exception
} else {
myPromise.success("yay!")
}
} (aDifferentExecutionContext)
myPromise.future
}
答案 0 :(得分:4)
在我看来,你喜欢混合范式。 Promise
是完成Future
的必要方法,但也可以通过将计算包装在Future
构造函数中来完成Future
。你两个都做,这可能不是你想要的。两个代码片段中的第二个语句都是Future[Promise[String]]
类型,我几乎可以肯定你真的只想要Future[String]
。
如果您正在使用Future.apply
构造函数,则应该将生成的值视为Future
,而不是使用它来解析单独的Promise
值:< / p>
val myFuture = Future {
// Do some long operation that might fail
if (failed) {
throw new RuntimeException("message")
} else {
"yay!"
}
}
使用Promise
的方法是创建Promise
,将其Future
提供给其他一些关心的代码,然后使用.success(...)
或{{ 1}}在经过一些长时间的运行后完成它。所以回顾一下,最大的区别是.failure(...)
必须包装整个计算,但如果需要的话,你可以传递Future
并在其他地方完成。