当前位置: 首页 > 知识库问答 >
问题:

访问 scala 期货返回的值

松涵容
2023-03-14

我是Scala期货的新手,我对Scala期货的回报值有疑问。

因此,scala未来的语法通常是

 def downloadPage(url: URL) = Future[List[Int]] {

 }

我想知道如何从调用此方法的其他方法访问List[Int]

换句话说,

val result = downloadPage("localhost") 

那么应该用什么方法让< code>List[Int]脱离未来呢?

我尝试过使用地图方法,但无法成功做到这一点。

共有3个答案

齐鹏程
2023-03-14

我希望你已经解决了这个问题,因为它是在2013年提出的,但也许我的回答可以帮助其他人:

如果您使用的是Play框架,它支持异步操作(实际上所有操作在内部都是异步的)。创建异步操作的一种简单方法是使用Action.async()。您需要为此函数提供一个未来[Result]

现在,您只需使用Scala的map、生成器映射、用于理解或异步/等待即可从您的Future[List[Int]]Future[Result]进行转换。这是Play Framework留档的示例。

import play.api.libs.concurrent.Execution.Implicits.defaultContext

def index = Action.async {
  val futureInt = scala.concurrent.Future { intensiveComputation() }
  futureInt.map(i => Ok("Got result: " + i))
}
燕璞
2023-03-14

你需要等待未来的完成才能在给定的时间跨度内获得结果,这里有一些可行的方法:

  import scala.concurrent.duration._

  def downloadPage(url: URL) = Future[List[Int]] {
    List(1,2,3)
  }

  val result = downloadPage("localhost")

  val myListInt = result.result(10 seconds)

理想情况下,如果您使用的是Future,您不希望阻止执行线程,因此您可以将处理Future结果的逻辑移动到on完成方法中,如下所示:

  result.onComplete({
    case Success(listInt) => {
      //Do something with my list
    }
    case Failure(exception) => {
      //Do something with my error
    }
  })
安建木
2023-03-14

成功案例(listInt) =

最好的做法是不返回该值。相反,您只需将未来(或使用mappp Map等转换的版本)传递给需要此值的每个人,他们可以在完整的中添加自己的

如果您确实需要返回它(例如,在实现遗留方法时),那么您唯一能做的就是阻塞(例如,使用等待.result),您需要决定等待多长时间。

 类似资料:
  • 我正在使用: Scala 2.10 游戏2.1 目前,我正在使用 类,但我愿意尝试另一个 API。 我很难将多个期货的结果组合成一个列表[(String, String)]。 以下 方法成功地将单个 Future 的结果返回到 HTML 模板: 方法执行 Web 服务 API 调用并返回 Future[play.api.libs.ws.Response]。方法 向 HTML 模板返回 List[(

  • 我正在努力理解这个概念。我清楚地了解期货是什么。我对Promises有点困惑。下面的代码片段: 现在,以下两个代码片段之间有什么区别? 和 我对第一个的理解是,p成功将完成与该p相关的未来计算。计算是异步的吗?这与使用 Future 块完成与 Promise p 关联的 Future f 的第二个代码片段有何不同?

  • 我有两个在未来发生的计算,如下所示: 我希望它能够运行,以便comp2总是在comp1完成后运行!我知道使用一个表达,我可以组成这两个Future的喜欢。 什么能保证comp1在comp2之前完成?我的意思是这些是发生在不同线程中的计算,并且不能保证运行的顺序。有没有一种方法可以保证没有阻塞的顺序?

  • 在用收益结构组合期货时,有些有副作用,有些没有,我引入了竞争条件,因为取决于副作用的未来并没有将副作用的结果作为论据。 简而言之: 未来b读取由来自未来a的副作用改变的值,但是未来a不明确依赖于未来b的结果,因此可能在b完成读取之前发生。 为了解决这个问题,我的同事引入了一个虚拟函数,将b的结果作为参数并简单地将其丢弃。这样做是为了使依赖显式化。 实际代码如下: 在这种情况下,未来 b 为 带哑参

  • 我正在尝试访问秒napshot.data()返回的内容,但有一个问题,如下面的评论所述。我试图创建一个异步函数,但无济于事。知道出了什么问题吗?请查看2条评论。

  • 我正在阅读Scala 2.11.8留档的函数在scala.concurrent.Future模块,它说: 将副作用函数应用于这个未来的结果,并返回一个包含这个未来的结果的新的未来。 这个方法允许强制回调以指定的顺序执行。 请注意,如果其中一个链式第四个回调引发异常,则该异常不会传播到后续的第四个调用。相反,随后的第四次回调将被赋予此未来的原始值。 我不确定< code >和不传播异常到底是什么意思