这两种完成失败Future的方法有什么区别吗?如果是,哪种方式被认为更"正确"?
调用Promise.f失败:
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
}
在我看来,这就像是在混合范式。Promise
是完成Future
的必要方式,但Future
也可以通过将计算封装在Future
构造函数中来完成。你同时在做这两件事,这可能不是你想要的。两个代码片段中的第二条语句的类型都是Future[Promise[String]]
,我几乎可以肯定,您真的只想要Future[String]
。
如果您使用Future.apply
构造函数,则应该将生成的值视为Future
,而不是使用它来解析单独的Promise
值:
val myFuture = Future {
// Do some long operation that might fail
if (failed) {
throw new RuntimeException("message")
} else {
"yay!"
}
}
使用Promise
的方法是创建Promise
,将其Future
交给其他关心的代码,然后使用.success(...)
或.failure(...)
在一些长时间运行后完成它。综上所述,最大的区别是Future
必须封装整个计算,但如果需要,您可以传递Promise
并在其他地方完成它。