spa*_*rkr 0 scala future promise
我使用以下方法使用异步库:
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
}
}
Run Code Online (Sandbox Code Playgroud)
它无法编译错误:
[error] found: scala.concurrent.Future[Option[MyType]]
[error] required: Option[MyType]
Run Code Online (Sandbox Code Playgroud)
哪个我不明白?
你可以这样做,没有承诺和异步
def myMethod(param: Long, isTru: Boolean): Future[Option[MyType]] = {
if (isTru) {
doSomething(param).map(res => Some(MyType(param, res)))
}
else {
Future.successful(None)
}
}
Run Code Online (Sandbox Code Playgroud)
承诺实际上很少使用
或者如果你想使用async,请这样做:
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
}
}
Run Code Online (Sandbox Code Playgroud)
使用异步块的全部意义在于,从中返回的是您想要的某种类型(可能不是Future),然后将其包装在一个中.因此,如果你需要Option[MyType]退货,它将被包装在一个未来给你预期Future[Option[MyType]].什么使async有用是await()函数改变Future[T]为T你可以正常使用的,没有映射和其他类似的东西,它有时比嵌套很多flatMaps更具可读性.
可选地,如果你只是像这样包装你的代码应该工作promise.future,但这个解决方案对我来说非常难看.await()await(promise.future)
| 归档时间: |
|
| 查看次数: |
772 次 |
| 最近记录: |