Scala compilation error: Required: Future[S_] Found: String
Scala compilation error: Required: Future[S_] Found: String
下面的函数应该得到一个代码块来执行它,并且 return 未来会有相应的消息响应。
我收到编译错误:Required: Future[S_] Found: String,有人可以解释为什么吗?
def withTransaction(blockOfCode: => Future[User])(implicit transaction: Transaction[User]): Future[String] = Future {
println("WithTransaction called...")
blockOfCode.flatMap(_ => {
transaction.commit()
"Success"
}).recover { // here is the error
transaction.rollback()
"Failed"
}
}
Future#recover
需要 部分函数
def recover[U >: T](pf: PartialFunction[Throwable, U])(implicit executor: ExecutionContext): Future[U] =
可以使用大括号和大小写语法来表达,就像这样
{ case e => expression }
然而,由于未使用 e
,我们不妨使用 丢弃的参数 函数语法,根据 jwvh 的评论,
_ => expression
在您的特定情况下,您选择哪一个并不重要,但一般来说,部分功能允许您针对不同类型的错误使用不同类型的恢复机制
{
case e: SocketTimeoutException => // recovery mechanism A
case e: ArithmeticException => // recovery mechanism B
case ...
}
此外,您可能需要 map
而不是 flatMap
,因为您要映射到 "Success"
而不是 Future("Success")
。考虑
之间的区别
Future(42).map(_ => "hello") // ok
Future(42).flatMap(_ => "hello") // error
Future(42).flatMap(_ => Future("hello")) // ok
把它放在一起试试
def withTransaction(
blockOfCode: => Future[User]
)(implicit transaction: Transaction[User]): Future[String] = {
blockOfCode
.map { _ =>
transaction.commit()
"Success"
}.recover { _ =>
transaction.rollback()
"Failed"
}
}
下面的函数应该得到一个代码块来执行它,并且 return 未来会有相应的消息响应。 我收到编译错误:Required: Future[S_] Found: String,有人可以解释为什么吗?
def withTransaction(blockOfCode: => Future[User])(implicit transaction: Transaction[User]): Future[String] = Future {
println("WithTransaction called...")
blockOfCode.flatMap(_ => {
transaction.commit()
"Success"
}).recover { // here is the error
transaction.rollback()
"Failed"
}
}
Future#recover
需要 部分函数
def recover[U >: T](pf: PartialFunction[Throwable, U])(implicit executor: ExecutionContext): Future[U] =
可以使用大括号和大小写语法来表达,就像这样
{ case e => expression }
然而,由于未使用 e
,我们不妨使用 丢弃的参数 函数语法,根据 jwvh 的评论,
_ => expression
在您的特定情况下,您选择哪一个并不重要,但一般来说,部分功能允许您针对不同类型的错误使用不同类型的恢复机制
{
case e: SocketTimeoutException => // recovery mechanism A
case e: ArithmeticException => // recovery mechanism B
case ...
}
此外,您可能需要 map
而不是 flatMap
,因为您要映射到 "Success"
而不是 Future("Success")
。考虑
Future(42).map(_ => "hello") // ok
Future(42).flatMap(_ => "hello") // error
Future(42).flatMap(_ => Future("hello")) // ok
把它放在一起试试
def withTransaction(
blockOfCode: => Future[User]
)(implicit transaction: Transaction[User]): Future[String] = {
blockOfCode
.map { _ =>
transaction.commit()
"Success"
}.recover { _ =>
transaction.rollback()
"Failed"
}
}