gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:40:59 33 4
gpt4 key购买 nike

用例实际上非常典型。许多 Web 服务使用您在 session 开始时检索的授权 token ,您需要在后续请求中发回这些 token 。

我知道我可以这样做:

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 也可能存在时间问题——因此可变变量的弊端 :)

还有其他方法吗?

最佳答案

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

Future/Promise Scala 方法是使用 Future[T]Promise[T] 而不是 val x: T,但这种方式意味着每次使用 val 时 executionContextmap 的大量开销,以及更优化的资源在所有情况下,利用率可能都不值得降低可读性,因此如果您在应用程序的许多部分广泛使用该值,则可以将 Await 留在那里。

关于scala - Play 2.5.x (Scala) -- 如何将通过 wsClient 获得的值放入(惰性)val,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37617384/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com