我编写了一个返回IO值的函数:
def foo(x : Int): IO[Future[Int]] = IO {
// do some IO
}
我正在使用Scalaz的IO类型类。
然后我将其用于表达式,如下所示:
(for {
_ <- foo(10)
} yield bar()).unsafePerformIO()
由于调用foo
的结果为Future
,此Future
将在单独的帖子中执行而yield
会立即调用bar()
,或者产量会等到Future
完成后才能调用bar()
吗?
更新
我进行了以下实验,看起来它不会瞬间产生:
def foo() : IO[Future[Unit]] = IO { Future.successful(bar()) }
def bar() : Unit = {
Thread.sleep(200000);
println("done")
}
scala> (for {
| _ <- foo()
| } yield "bar").unsafePerformIO()
res3: String = bar
有没有办法异步处理这个未来?
答案 0 :(得分:1)
IO { Future.successful(bar()) }
将执行bar()
,将其与Success
或Failure
一起打包,并将结果放入IO
。
另一方面
IO { Future { bar() } } // or IO { Future(bar()) }
将通过隐式bar()
将ExecutorContext
执行委托给单独的线程。
Future(value: => T)
是一个异步调用,你正在寻找什么,而Future.successful(value: => T)
是同步的,应该只用于立即返回已计算的值。