我是Scala和Play 2.0的新手,所以这可能是一个非常简单的问题。我有以下代码(为了简明起见,我做了伪代码):
var someExternalUrl = ...
def oauth = Action { request =>
val paramMap = request.queryString.map { case (k, v) => k -> v.mkString }
if (paramMap.contains("error")) {
// Redirect to error page
} else {
val d2 = Duration(1000, "millis")
val futureResponse = ws.url(someExternalUrl).withQueryString(...).toString).get()
var m = futureResponse.map(response => {
val json = response.json
val userId: String = (json \ "user_id").as[String]
Redirect(routes.Application.home()).withSession(
"user_id" -> userId
)
})
Await.result(m, d2)
}
}
这是处理外部URl调用结果的正确方式吗?我见过一些帖子说使用onComplete来处理期货,而不是使用Await,因为它是阻塞的。
发布于 2017-01-12 04:39:50
正如@ provides评论的那样,Play为这种情况提供了Action.async
。有关文档的更多信息,请访问:https://www.playframework.com/documentation/2.5.x/ScalaAsync#Returning-futures
做一个Await
(几乎?)从来都不是一个好的解决方案
https://stackoverflow.com/questions/41599145
复制相似问题