7

我正在尝试使用Future从一个巧妙的动作返回的 s 将一些基本功能链接在一起,我遇到了一些非常微不足道的绊脚石。

andThenonSuccess方法都需要作为PartialFunction参数传递。我的理解可能有很大的缺陷,但在阅读了匿名函数之后,似乎andThen需要知道你的匿名函数以迎合任何SuccessFailure输入。

鉴于onSuccess已经只满足这种Success情况,为什么它仍然需要是一个PartialFunction

这段代码表明我遇到的问题:

val db = Database.forConfig("h2mem1")

try {
  val f = db.run(setupCommands)
    .onSuccess { println(_) }

  Await.ready(f, 10.seconds )
}
finally db.close

我得到一个编译错误:

[error]  found   : Unit => Unit
[error]  required: PartialFunction[Unit,?]
[error]         .onSuccess { println(_) }
4

2 回答 2

3

他们这样做是为了让您可以对结果进行模式匹配,尽管我同意这似乎没有必要,但我并没有真正使用并且onSuccess更喜欢我的未来:mapflatMap

  val f = Future.successful("test")

  f.onSuccess({
    case "test" => println("Worked")
    case x: String => println(s"Kind of worked: $x")
  })

在更高级的数据类型的情况下,我可以看到这更有用:

  val fOpt = Future.successful(Option("Test"))

  fOpt.onSuccess({
    case Some(x) => println(x)
    case None => println("None")
  })

真的,这可能只是来自actor api,因为当你ask是一个不知道返回类型的actor时,你需要对其进行模式匹配,因为它是Any

  val actor:ActorRef = ???

  val fAny = actor ? "asking"

  fAny.onSuccess({
    case x:String => println(s"Something String $x")
    case x:Int => println(s"Something Int $x")
    case x => println(s"Something else $x")
  })
于 2015-07-06T20:13:30.437 回答
1

PartialFunction好吧,如果它需要一个,你可以只传递一个:

db.run(setupCommands).onSuccess(PartialFunction(println))

或者:

db.run(setupCommands).onSuccess { case result => println(result) }
于 2015-07-06T19:26:28.003 回答