返回 Future 的 Scala 方法
Scala method returning a Future
我使用异步库的以下方法:
def myMethod(param: Long, isTru: Boolean): Future[Option[MyType]] = async {
if (isTru) {
val promise = Promise[Option[MyType]]
val myFuture = doSomething(param)
myFuture.onComplete {
case Success(succ) => {
promise.success(Some(MyType(param, succ)))
}
case Failure(fail) => promise.failure(fail)
}
promise.future // fails here
}
else {
None
}
}
编译失败,错误为:
[error] found: scala.concurrent.Future[Option[MyType]]
[error] required: Option[MyType]
哪个我不明白?
'if' 语句的两个分支都应该 return Option[MyType],如果你使用 async {...} 或 Future[Option[MyType]],那么你不需要异步
类型 Option
不是类型 Future
,请注意 if-else
表达式,
if() {...
promise.future // fails here
}
else {
None
}
你可以这样做,没有承诺和异步
def myMethod(param: Long, isTru: Boolean): Future[Option[MyType]] = {
if (isTru) {
doSomething(param).map(res => Some(MyType(param, res)))
}
else {
Future.successful(None)
}
}
promises 实际上很少被使用
或者如果你想使用异步,请这样做:
def myMethod(param: Long, isTru: Boolean): Future[Option[MyType]] = async {
if (isTru) {
val myFuture = doSomething(param)
val myResult = await(myFuture)
Some(MyType(param, myResult))
}
else {
None
}
}
使用 async 块的全部意义在于,你从中 return 得到的是你想要的某种类型(可能不是 Future),然后它被包裹在一个里面。所以如果你需要 Option[MyType]
return 它,它会被包裹在一个 Future 里面给你预期的 Future[Option[MyType]]
。使 async 有用的是 await() 函数,它将 Future[T]
更改为 T
您可以正常使用,无需映射和其他类似的东西,它有时比嵌套大量 flatMaps 更具可读性。
可选地,如果您像这样将 promise.future
包装在 await()
中,您的代码应该可以工作 await(promise.future)
但这个解决方案对我来说非常难看。
我使用异步库的以下方法:
def myMethod(param: Long, isTru: Boolean): Future[Option[MyType]] = async {
if (isTru) {
val promise = Promise[Option[MyType]]
val myFuture = doSomething(param)
myFuture.onComplete {
case Success(succ) => {
promise.success(Some(MyType(param, succ)))
}
case Failure(fail) => promise.failure(fail)
}
promise.future // fails here
}
else {
None
}
}
编译失败,错误为:
[error] found: scala.concurrent.Future[Option[MyType]]
[error] required: Option[MyType]
哪个我不明白?
'if' 语句的两个分支都应该 return Option[MyType],如果你使用 async {...} 或 Future[Option[MyType]],那么你不需要异步
类型 Option
不是类型 Future
,请注意 if-else
表达式,
if() {...
promise.future // fails here
}
else {
None
}
你可以这样做,没有承诺和异步
def myMethod(param: Long, isTru: Boolean): Future[Option[MyType]] = {
if (isTru) {
doSomething(param).map(res => Some(MyType(param, res)))
}
else {
Future.successful(None)
}
}
promises 实际上很少被使用
或者如果你想使用异步,请这样做:
def myMethod(param: Long, isTru: Boolean): Future[Option[MyType]] = async {
if (isTru) {
val myFuture = doSomething(param)
val myResult = await(myFuture)
Some(MyType(param, myResult))
}
else {
None
}
}
使用 async 块的全部意义在于,你从中 return 得到的是你想要的某种类型(可能不是 Future),然后它被包裹在一个里面。所以如果你需要 Option[MyType]
return 它,它会被包裹在一个 Future 里面给你预期的 Future[Option[MyType]]
。使 async 有用的是 await() 函数,它将 Future[T]
更改为 T
您可以正常使用,无需映射和其他类似的东西,它有时比嵌套大量 flatMaps 更具可读性。
可选地,如果您像这样将 promise.future
包装在 await()
中,您的代码应该可以工作 await(promise.future)
但这个解决方案对我来说非常难看。