用例实际上相当典型。许多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)
}
只是感觉不对,因为所有的医生都说我们永远不会等待。
是否有未来/承诺Scala风格的处理方式?
我发现.onComplete
允许我在完成Promise时运行代码,但不使用(可变)var
我看不到在该范围内获取值的方法另一个范围内的lazy val
。即使有var
,也有可能的时间问题 - 因此可变变量的弊端:)
还有其他方法吗?
答案 0 :(得分:0)
不幸的是,没有办法使这种非阻塞 - lazy val
被设计为同步并阻止访问它们的任何线程,直到它们用值完成(内部synchronized
是表示为一个简单的Future/Promise
块。
Future[T]
Scala方式是使用Promise[T]
或val x: T
而不是executionContext
,但这种方式意味着大量的开销{{1每次使用val时,s和map
s,在所有情况下,更优化的资源利用率可能不值得降低可读性,因此如果你广泛地将Await
留在那里可能没问题。在应用程序的许多部分中使用该值。