scala – IO Monad中未来的行为
发布时间:2020-12-16 08:44:55 所属栏目:安全 来源:网络整理
导读:我编写了一个返回IO值的函数: def foo(x : Int): IO[Future[Int]] = IO { // do some IO } 我正在使用Scalaz的IO类型类. 然后,我将其用于表达式,如下所示: (for { _ - foo(10) } yield bar()).unsafePerformIO() 由于调用foo的结果是Future,这个Future将在
我编写了一个返回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(),还是在调用bar()之前,yield会等到Future完成? 更新: 我运行了以下实验,看起来它不会瞬间产生: 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 有没有办法异步处理这个未来? 解决方法IO { Future.successful(bar()) } 将执行bar(),用Success或Failure包装它并将结果放入IO. 另一方面 IO { Future { bar() } } // or IO { Future(bar()) } 将通过隐式ExecutorContext将bar()执行委托给单独的线程. Future(value:=> T)是一个异步调用,你正在寻找,而Future.successful(value:=> T)是同步的,应该只用于立即返回已计算的值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |