加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 为什么Future.onSuccess需要部分功能

发布时间:2020-12-16 19:13:10 所属栏目:安全 来源:网络整理
导读:我试图将一些基本功能链接在一起,使用从光滑动作返回的Futures,我正在打一些非常琐碎的绊脚石. andThen和onSuccess方法都需要将PartialFunction作为参数传递.我的理解可能是相当有缺陷的但是在阅读了大约anonymous functions之后,似乎并且需要知道你的匿名函
我试图将一些基本功能链接在一起,使用从光滑动作返回的Futures,我正在打一些非常琐碎的绊脚石.

andThen和onSuccess方法都需要将PartialFunction作为参数传递.我的理解可能是相当有缺陷的但是在阅读了大约anonymous functions之后,似乎并且需要知道你的匿名函数,以满足任何成功或失败的输入.

鉴于onSuccess已经只满足成功案例,为什么它仍然需要是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(_) }

解决方法

他们这样做了,所以你可以对结果进行模式匹配,虽然我同意它似乎不必要,但我并没有真正使用onSuccess而更喜欢映射和flatMap我的未来:

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

真的,这可能只是来自演员api,因为当你问一个演员你不知道返回类型时,你需要对它进行模式匹配,因为它是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")
  })

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读