作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
用例实际上非常典型。许多 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 时 executionContext
和 map
的大量开销,以及更优化的资源在所有情况下,利用率可能都不值得降低可读性,因此如果您在应用程序的许多部分广泛使用该值,则可以将 Await
留在那里。
关于scala - Play 2.5.x (Scala) -- 如何将通过 wsClient 获得的值放入(惰性)val,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37617384/
我是一名优秀的程序员,十分优秀!