【问题标题】:Usage scala Futures fallbackTo使用 scala 期货 fallbackTo
【发布时间】:2015-10-05 16:09:28
【问题描述】:

我正在努力实现这样的目标。

val x: SomeType = ...    
val future: Future[SomeType] = Future {
  /*
   * Do some operation on x
   */
  x
}
future onComplete {
  case Success (x): x.status = "Success";
  case Failure (t):
    /*
     *  Here I want to write x.status = "Failed", But
     *  x is not available in this scope
     */
}

实现这一目标的有效方法是什么?

【问题讨论】:

  • 'case Failure' 意味着您的代码(在 'Future{...}' 内)已引发异常,因此无法让 x 因为它没有返回(即使您使用正常方式,如 fallBackTo、recover、recoverWith)。无论如何,我不建议在这里使用可变数据。没有这个可以解决你的问题。

标签: scala


【解决方案1】:

首先,您的代码看起来不像是正确的 Scala 代码。 Case-Match 是错误的,Future[x] 中,你应该提到类型为x,但返回x 本身,它应该是一个对象。

无论如何,您可以执行以下操作。当 Future 成功时,您可以将值记录在 var 中,如果失败,您仍然可以将值记录在 var 中。然而,这会给你的程序带来可变状态,很快就会失控。所以最好使用惯用的 Scala 代码(使用 map、flatMap 等),并完全避免使用状态。

import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.Random

object TestFuture {

  def main(args: Array[String]) {

    val future: Future[Int] = Future {
      if (Random.nextBoolean()) {
        10
      } else {
        throw new RuntimeException("Error")
      }
    }

//    future onComplete {
//      case Success(x) =>
//        println(x)
//      case Failure(t) =>
//        t.printStackTrace()
//    }

    future onSuccess {
      case x => println(s"SUCCESS: $x")
        // SUCCESS: 10
    }

    future onFailure {
      case x => println(s"FAILURE: $x")
        // FAILURE: java.lang.RuntimeException: Error
    }

    Await.ready(future, Duration.Inf)
  }

}

有不止一种方法可以做到这一点。

还要检查以下内容:

【讨论】:

  • 对不起。你的第一段是我的意思,直到现在才意识到。更新了问题。
【解决方案2】:

我认为您是从可变/程序的角度来看它。最好像 Monad 一样使用它。你可以这样做:

case class Result(status: String)

val future: Future[Result] = Future { ... }

future map {
  result => result.copy(status = "Success")
} recover {
  case NonFatal(_) => Result("Failure")
}

这将始终返回具有正确状态的“成功”Future。也没有发生可变性。

我没有检查它是否编译;)

【讨论】:

    猜你喜欢
    • 2020-01-20
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2013-04-27
    • 2015-07-22
    相关资源
    最近更新 更多