【问题标题】:Transform Future[T] to Future[Try[T]]将 Future[T] 转换为 Future[Try[T]]
【发布时间】:2016-03-07 20:00:09
【问题描述】:

我试图理解以下答案How to carry on executing Future sequence despite failure?。 (希望这不是值得一票的,因为我正在尝试理解这里的代码。)

我不明白 mapValue 如何将 Future[T] 转换为 Future[Try[T]]

def mapValue[T]( f: Future[T] ): Future[Try[T]] = {
  val prom = Promise[Try[T]]()
  f onComplete prom.success
  prom.future
}

f onComplete prom.success 行,它在做什么。我的理解是 prom.success 必须采用 Try[T] 类型的对象,但在这里它不这样做。也没有对 f 的赋值,它将 Future[T] 转换为 Future[Try[T]]。 此外,anThen on Future 应该是一个副作用,并且应该返回与它相同的未来值,因此不确定转换是如何发生的。

【问题讨论】:

  • 为什么将Try 包装在那里,因为Future 处理错误
  • 看原题链接了解上下文
  • 你能举个例子吗?即 - mapValue ( example ) 然后是预期的输出?
  • @KevinMeredith 查看问题中发布的链接。这里stackoverflow.com/questions/15775824/…

标签: scala future


【解决方案1】:

f onComplete prom.success 行被 Scala 编译器解析如下:

  1. 在某些情况下可以省略点和括号,因此f onComplete xf.onComplete(x) 的一种写法。
  2. 编译器发现onComplete 方法将f: Try[T] => U 作为参数函数。您还传递了一个函数作为参数,Promise#success,它具有兼容的签名。

所以这个方法正在做的是创建一个Try[T] 类型的新Promise(可写未来),并在原始未来完成时使用包装的Try[T] 完成该承诺。然后它返回从 promise 获得的新的Future[Try[T]]

【讨论】:

  • 感谢@maxim 令人困惑的是,这里的承诺是如何完成的,prom.success 就像你指出的那样返回一个函数。 promise.future 是如何分配 T 的?您是否建议在执行 f.onComplet 时将 f 的值传递给 prom.success ?一个
  • 当你调用prom.success时,promise返回的future由promise内部逻辑完成。您的代码中没有变量赋值,它在承诺代码中。
  • 通常 Promise#Success 接受一个在 Future 内部返回的参数。这里 prom.succes 没有使用任何参数。
  • 它需要,但在这里你不调用它。在没有参数的情况下引用Promise#success 您引用了一个函数本身,并且此函数被传递给onComplete。所以onComplete 将调用success,其值与原始未来的值相同。
  • 啊!最后一个问题,感谢您的耐心等待。未来的原始值如何,在这种情况下,当 T 传递给 Promise#Success 时,T 变为 Try[T]。
【解决方案2】:

为了扩展 Maxim 的答案,f onComplete prom.success 可以重写为:

f.onComplete(prom.success)

f.onComplete(prom.success(_))

f.onComplete { resultOfFutureAsTry =>
  prom.success(resultOfFutureAsTry)
}

prom.success 设置承诺的 success 值。因此,无论原来的futuref内部发生什么,(抛出异常,或者future成功完成),新的future(由prom.future返回,在原来的future完成后创建)总是成功的未来。有时,成功的未来包含Failure[T],有时包含Success[T]

旁注:f.onComplete 经常被这样使用:

f.onComplete {
  case Success(x) => println(s"Yay, $x worked!")
  case Failure(ex) => println(s"Darn, it failed: $ex")
}

但这只是写函数f: Try[T] => U的方便方式。

【讨论】:

    猜你喜欢
    • 2019-10-25
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多