【问题标题】:How to concurrently create Future from Try?如何从 Try 中同时创建 Future?
【发布时间】:2021-06-07 19:19:06
【问题描述】:

scala Future 有一个 fromTry 方法

用指定的结果创建一个已经完成的 Future 或 例外。

问题是新创建的Future已经完成了。是否可以同时对Try 进行评估?

例如,给定一个返回Try的函数:

def foo() : Try[Int] = {
  Thread sleep 1000
  Success(43)
}

foo的评估如何同时进行?

一种粗略的方法是简单地将Future 包裹在函数周围:

val f : Future[Try[Int]] = Future { foo() }

但所需的返回类型是Future[Int]

val f : Future[Int] = ???

实际上,Try 如何在类似于fromTry 方法的Future 中展平?

a similar question,但问题&答案等待Try的评估,然后再构建完成的Future。

【问题讨论】:

  • 正如我常说的,Scaladoc 是你的朋友 - Future.delegate(Future.fromTry(foo()))
  • 不,delegate 不是。您正在寻找Future(foo.get)
  • @Dima 仅当TrySuccess 而不是Failure 时才有效。
  • @RamónJRomeroyVigil 不。无论哪种方式都可以。试试看:)
  • @Dima 打代码高尔夫 :) 我认为 Luis 的挥杆是正确的,因为 delegate 在执行上下文中执行了按名称参数。我的挥杆:Future(foo()).flatMap(Future.fromTry)

标签: multithreading scala concurrency future


【解决方案1】:

最少的仪式大概是:

Future.unit.transform(_ => foo())

特别提到@Dima 提出的Future(foo().get) 的建议更短一些,但可能可读性稍差。

【讨论】:

    【解决方案2】:

    基于 cmets,

    斯卡拉 >= 2.13:

    val f : Future[Int] = Future.delegate(Future.fromTry(foo()))
    

    斯卡拉

    val f : Future[Int] = Future(foo()).flatMap(Future.fromTry)
    

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 1970-01-01
      • 2023-03-20
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-25
      • 2012-10-22
      相关资源
      最近更新 更多