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

在Scala中用副作用期货组合无状态期货

束建章
2023-03-14

在用收益结构组合期货时,有些有副作用,有些没有,我引入了竞争条件,因为取决于副作用的未来并没有将副作用的结果作为论据。

简而言之:

未来b读取由来自未来a的副作用改变的值,但是未来a不明确依赖于未来b的结果,因此可能在b完成读取之前发生。

为了解决这个问题,我的同事引入了一个虚拟函数,将b的结果作为参数并简单地将其丢弃。这样做是为了使依赖显式化。

实际代码如下:

  val futureConnection:Future[(Either[String, (Connection)],Boolean)] =
    for {
      scannerUser <- scanner.orFail("Scanning user not found")
      scannedUser <- futureScannedUser.orFail("Scanned user not found")
      existsInAnyDirection <- connections.existsInAnyDirection(scannerUser, scannedUser)
      connection <- connections.createConnection(scannerUser, scannedUser, form.magicWord, existsInAnyDirection)
    } yield {
      (connection, existsInAnyDirection)
    }

在这种情况下,未来 b 为

connections.existsInAnyDirection(scannerUser, scannedUser)

带哑参数的未来a是

< code > connections . create connection(scanner user,scannedUser,form.magicWord,existsInAnyDirection)

请注意,参数< code > existsInAnyDirection 从未在< code>createConnection中使用。这有效地创建了依赖图,即在existsInAnyDirection完成之前不能启动createConnection。

现在的问题是:

奖金信息

我自己的挖掘告诉我,Scala的未来不能很好地处理副作用。处理副作用的Future trait上的方法返回单元,而从副作用操作中很可能会读取结果,即错误代码、生成的ID、任何其他元信息。

共有1个答案

马寒
2023-03-14

Future正在处理延迟计算的副作用,如A=

您尝试混合几种不同的副作用,但只组合了其中一种Future[_]

尝试选择第二个容器,这可以是产品或状态,取决于您的副作用并考虑副作用的组合方式(可能是您需要modand transvers)。在您的代码之后可以看起来像(最简单的情况):

for {
  scannerUser <- scanner.orFail("Scanning ...")
  (scannedUser, magicWord) <- futureScannedUser.orFail("Scanned ...")      
  connection <- connections.createConnection(scannerUser, scannedUser, magicWord)
} yield {
  (connection, existsInAnyDirection)
}

// OR

for {
  (scannerUser, state) <- scanner.orFail("Scanning ...")
  (scannedUser, nextState) <- futureScannedUser(state).orFail("Scanned ...")      
  connection <- connections.createConnection(scannerUser, scannedUser, nextState)
} yield {
  (connection, existsInAnyDirection)
}

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

  • 我是Scala未来的新手,我还没有找到问题的解决方案。我正在努力实现以下目标(总体描述:努力获取一个酒店列表的客人列表,分别查询每个酒店): < li >对另一个API进行n次调用,每次调用都超时 < li >合并所有结果(将列表转换为包含所有元素的列表) < li >如果单个调用失败,记录错误并返回一个空列表(本质上,在这种情况下,如果我得到部分结果总比没有结果好) < li >理想情况下,如果

  • 我必须从带有Scala的RESTAPI中获取给定列表中每个文件的问题列表。我想并行处理这些请求,并使用调度库来实现。我的方法是从Java框架调用的,我必须在该方法结束时等待所有未来的结果,以将整体结果返回到框架。这是我的密码: 这段代码有几个问题。首先,我没有得到我期望的< code>issuesByFile (1)的类型。如果< code>findLookUpId无法找到查找Id(即< code

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

  • 我想把这个val: 对它进行一些操作(我正在考虑展平) 然后得到这个结果 如果展平方法在这里不合适,那很好。只要我得到结果。 谢啦!

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