3

用例实际上是相当典型的。许多 Web 服务使用您在会话开始时检索的授权令牌,您需要在后续请求中将其发回。

我知道我可以这样做:

lazy val myData = {    
    val request = ws.url("/some/url").withAuth(user, password, WSAuthScheme.BASIC).withHeaders("Accept" -> "application/json")
    Await.result(request.get().map{x => x.json }, 120.seconds)
}

这感觉不对,因为所有文档都说我们永远不会等待。

是否有 Future/Promise Scala 风格的处理方式?

我发现.onComplete它允许我在完成 Promise 时运行代码,但是不使用(可变)var我看不到将该范围内的值获取到lazy val不同范围内的方法。即使var有一个可能的时间问题 - 因此可变变量的弊端:)

还有其他方法吗?

4

1 回答 1

0

不幸的是,没有办法使这种非阻塞 - lazy vals 被设计为同步并阻塞任何访问它们的线程,直到它们完成一个值(内部 alazy val表示为一个简单的synchronized块)。

Scala的Future/Promise方式是使用 aFuture[T]或 aPromise[T]代替 a val x: T,但这种方式意味着每次使用 val 时都会产生大量的executionContexts 和maps 开销,并且更优化的资源利用可能不值得在所有情况下降低可读性,因此,Await如果您在应用程序的许多部分广泛使用该值,则可以将其留在那里。

于 2016-06-03T16:17:55.470 回答