def func1(list : List[T]) : Future[\/[Throwable,Unit] ]
def func2(list : List[T]) : Future[List[\/[Throwable,Unit]]]
其中T
只是一种特定类型,两种函数的类型相同。现在func2依赖于第一个func
未来的成功。所以func2
只有在func
成功完成后才能按顺序运行。我希望for
理解某些内容与下面类似的行(以下是有效的可编译代码)并返回Future[\/[Throwable,Unit] ]
def func3 combiner(list) : Future[\/[Throwable,Unit] ] = for{
u <- func1(list)
us <- u
d <- func2(list)
}yield
如何解决这个问题?
答案 0 :(得分:1)
因为期货要么以价值或例外完成,否则您不需要Either(或者您有其他理由使用它吗?)。 运行此代码应该可以帮助您(并阅读documentation on futures):
import scala.concurrent._
import ExecutionContext.Implicits.global
def f1(l: List[Int]): Future[Int] = future { println("f1"); l head }
def f2(l: List[Int]): Future[Int] = future { println("f2"); throw new Exception("bang") }
def f3(l: List[Int]): Future[Int] = future { println("f3"); l last }
val result1 = for {
x1 <- f2(List(1, 2))
x2 <- f1(List(1, 2)) // f1 is not run
} yield x2
val result2 = for {
x1 <- f1(List(1, 2))
x3 <- f3(List(1, 2))
} yield x3
result1.onComplete(res => println("result1 = " + res))
result2.onComplete(res => println("result2 = " + res))