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]]
>
在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)
}
}
这是另一种解决方案:
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返回一个