在恢复部分方法中调用未来[重复]。

问题描述 投票:0回答:1

我有部分方法 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
    }
  }

但我得到的是类型不匹配。我怎样才能实现这种错误处理?我是否需要使用其他方法而不是recover?

scala future
1个回答
2
投票

就像我常说的那样 鳞片 是你的朋友。你可以使用 recoverWith. 另外,请记住,它接收的是一个局部函数,所以你必须做一些类似的事情。

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

0
投票

你可以用recoverWith代替

  val res2 = getName(0) recoverWith {
    case _ =>  isEmergency().map {
      case false => "jane"
      case true => "arnold"
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.