【发布时间】:2018-01-02 19:30:24
【问题描述】:
我有两个方法,并且都返回 Future[Either[String, T]] 并希望将它们链接在一起以完成工作。我现在使用的是 Scala 2.12 无论是正确的偏见。
例如,
如果函数不返回 Future 和 Either 组合,我可以简单地执行以下操作。
def convert(a, b) = ???
def callA(): Future[A] = ???
def callB(a: A): Future[B] = ???
def chain: Future[C] = for {
a <- callA
b <- callB(a)
} yield convert(a, b)
但现在我想使用以下语法捕获错误,并传播到最终结果。实现这一目标的最佳方法是什么?也应该使用 callB 或 callB1 吗?
def convert(a, b): Future[Either[String, C]] = ???
def callA(): Future[Either[String, A]] = ???
def callB(a: A): Future[Either[String, B]] = ??? or
def callB1(eithera: Either[String, A]): Future[Either[String, B]] = ???
我知道使用猫转换单子可以简化这一点。欢迎给我使用标准库和猫的解决方案。
【问题讨论】:
-
如果您只是使用
Either的Left返回一个String,我认为这是一条包含错误的文本消息,为什么不简单地使用Success和Failure内置进入Future? -
猜你可能想看看
EitherTfromcatsorscalaz -
@Yaneeve 我只是想让它变得简单,它实际上是一个自定义的错误对象。
-
@TomerSela 是的,我看到了这篇文章,这个例子并没有真正链接两个期货,它更多的是关于并行执行,这很简单。另外我的问题更多的是关于设计,我们应该只传递值还是传递一个?谢谢。
标签: scala