【发布时间】:2015-09-10 15:51:32
【问题描述】:
鉴于我们必须避免...
1) 修改状态 2) 阻塞
...Future 的正确端到端用法是什么?
使用 Futures 的一般做法似乎是通过使用 map、flatMap 等将它们转换为其他 Futures,但永远创建 Futures 并不好。
是否总是会在某处调用 onComplete,方法将 Future 的结果写入应用程序外部的某处(例如 Web 套接字;控制台;消息代理),或者是否有非阻塞方式访问结果?
Scaladocs 中有关 Futures 的所有信息 - http://docs.scala-lang.org/overviews/core/futures.html 似乎最终都会写入控制台。 onComplete 不返回任何内容,因此我们可能不得不最终执行一些“即发即弃”的 IO。
例如致电println
f onComplete {
case Success(number) => println(number)
case Failure(err) => println("An error has occured: " + err.getMessage)
}
但是在更复杂的情况下,我们希望对 Future 的结果做更多的事情呢?
例如,在 Play 框架中,Action.async 可以返回一个 Future[Result] 并且框架处理其余部分。它最终会不会期望永远不会从未来得到结果?
我们知道用户需要返回一个Result,那么框架如何仅使用一个 Unit 方法来做到这一点?
是否有一种非阻塞的方式来检索未来的值并在应用程序的其他地方使用它,还是调用 Await 是不可避免的?
【问题讨论】:
-
result(goo.gl/GeW9Pl) 不返回Unit。您必须将Future视为在不同线程上生成计算的一种方式(我知道我过于简单化了)。 -
不使用等待阻塞?或者我们总是不得不在某个地方阻塞一个线程的想法。
-
等待被阻塞。我只是说一种方法是等待计算完成,但同时您可以做其他事情或在未完成的 Future 上定义计算。
标签: scala