Play 2.5.x(Scala) - 如何将通过wsClient获得的值放入(懒惰)val中

时间:2016-06-03 14:45:15

标签: scala playframework-2.0 future ws-client

用例实际上相当典型。许多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,也有可能的时间问题 - 因此可变变量的弊端:)

还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

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

Future[T] Scala方式是使用Promise[T]val x: T而不是executionContext,但这种方式意味着大量的开销{{1每次使用val时,s和map s,在所有情况下,更优化的资源利用率可能不值得降低可读性,因此如果你广泛地将Await留在那里可能没问题。在应用程序的许多部分中使用该值。