在恢复部分方法中调用 future

Calling future in recover partial method

我有部分方法defaultRecover帮助从异常中恢复:

  def getName(length: Int): Future[String] = {
    if (length > 0)
      Future.successful("john")
    else
      Future.failed(new RuntimeException("failed"))
  }

  def defaultRecover: PartialFunction[Throwable, String] = {
    case _ => "jane"
  }

  // easy and working
  val res = getName(0) recover {
    defaultRecover
  }

现在是问题。我定义了第二种恢复方法 emergencyRecover,我想根据另一个调用的结果选择使用哪种恢复方法 - isEmergency()

  def emergencyRecover: PartialFunction[Throwable, String] = {
    case _ => "arnold"
  }

  // simplified - this actually calls REST API
  def isEmergency(): Future[Boolean] = {
    Future.successful(true)
  }

  // type mismatch
  // required: PartialFunction[Throwable,String]
  // found   : Future[PartialFunction[Throwable,String]]
  val res = getName(0) recover {
    isEmergency() map {
      case false => defaultRecover
      case true => emergencyRecover
    }
  }

但是我发现类型不匹配。我怎样才能实现这种错误处理?我需要使用其他方法而不是恢复吗?

正如我常说的,scaladoc 是你的朋友。您可以使用 recoverWith.
此外,请记住它接收部分功能,因此您必须执行以下操作:

val res = getName(0) recoverWith {
  case e => isEmergency() map {
    case false => defaultRecover(e)
    case true  => emergencyRecover(e)
  }
}

您可以只使用 recoverWith 代替:

  val res2 = getName(0) recoverWith {
    case _ =>  isEmergency().map {
      case false => "jane"
      case true => "arnold"
    }
  }