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

Scala模式:用于产生未来的理解[a]

熊锐进
2023-03-14

Scala使用什么模式来处理这种情况:

你有很多未来(它们可以是任何东西,但为了举例…)

val aF = Future { true }
val bF = Future { Option(3) }
val cF = Future { myObject }

你有一个返回未来的函数

def fooF: Future[SomeObject]

我想做这样的事情:

for {
    a <- aF
    b <- bF
    c <- cF
} yield {
    if (a) {
        // do stuff with b & c
        fooF
    } else {
        Future.successful(SomeObject)
    }
}

我想返回一个值Future[(代码)Object),但是我在rent语句中调用foF,我会得到一个Future[Future[(代码)Object]]

共有2个答案

车嘉实
2023-03-14

>

  • 在Scala 2.12Future中有一个flatten方法:

    创建一个嵌套级别扁平化的新未来,此方法等效于 flatMap(标识)。

    所以你可以写{... } 产生{ ... } flatten

    在Scala中

    另一种解决方案是使用 flatMap 而不是用于理解:

    aF.flatMap { a =>
      if (a) {
        (bF zip cF).flatMap { (b, c) =>
          // do stuff with b & c
          fooF
        }
      } else 
        Future.successful(SomeObject)
      }
    }
    

  • 公西英叡
    2023-03-14

    这是另一种解决方案:

    def doStuffWith(a: A, b: B, c: C): Future[SomeObject] = if (a) {
      // do stuff with b & c
      fooF
    } else Future.successful(SomeObject)
    
    for {
      a <- aF
      b <- bF
      c <- cF
      d <- doStuffWith(a, b, c)
    } yield d
    

    正如@laughedelic答案中所讨论的,这是一个主观的观点,但我相信这种方式更具可读性和可维护性(例如,取出函数总是对其进行单元测试)。

     类似资料:
    • 任务是实现递归方法,返回 Future 并且由于这一部分("在其他递归(结果::: res,尝试1)")代码失败与错误,因为它期望未来[Seq[结果]],但实际上返回未来[对象]。 据我所知,问题在于yield块内的表达式必须返回Seq[Result],以便将来由Monad进行后续包装。但是“递归(结果::res,尝试1)”将返回未来。因此,不是预期的Seq[Result]收益率,而是包含未来的[

    • 我有两个函数返回期货。我正试图使用for-yield理解将第一个函数的修改结果输入到另一个函数中。 此方法有效: 然而,我对“如果”在那里不满意,似乎我应该能够使用地图。 但是当我尝试使用地图时: 我得到一个编译错误: 我尝试了一些变化,但没有发现任何有吸引力的工作。有人能提出更好的理解和/或解释我的第二个例子的错误吗? 下面是一个最小但完整的Scala 2.10可运行示例:

    • 我正在阅读Scala Cookbook(http://shop.oreilly.com/product/0636920026914.do) 有一个与未来使用相关的例子,涉及理解。 到目前为止,我对理解的理解是,当与一个集合一起使用时,它会产生另一个相同类型的集合。例如,如果每个< code>futureX的类型为< code>Future[Int],则以下内容也应为< code>Future[In

    • 有没有可能实现这样的事情: 我希望清楚我的意图是什么。

    • 我想在我的play scala Web应用程序中进行错误处理。 我的应用程序与数据库对话以获取一些行,它遵循以下流程。 < li >首先调用数据库以获取一些数据 < li >使用第一次调用中的数据从数据库中提取其他数据 < li >使用从最近两次db调用中收到的数据形成响应。 下面是我的伪代码。 以上理解中的每一个方法都返回一个未来,这些方法的签名如下。 在以下情况下,我该如何进行错误/故障处理

    • 我有一个表示DB记录的字符串id列表。我想从数据库异步加载它们,然后异步地将每个记录上传到远程服务器,然后当所有的上传都完成时,记录已上传记录的id。 因为我使用的是Scala 2.9.2,所以我使用的是Twitter的core-util Future实现,但是在单子转换方面,它应该和2.10 futures完全一样。 总的概念是这样的: 为了便于理解,我尝试通过一个来实现,但是fetch返回一个