使用相似的形状运行顺序期货用于理解

时间:2014-06-05 17:51:09

标签: scala scalaz

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

如何解决这个问题?

1 个答案:

答案 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))