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"
    }
}