执行 play Future 查询时,scala 变量的值不会改变。为什么?
Value of a scala variable do not change while executing play Future query. Why?
我是 SCALA 语言的新手,正在制作一个 API 服务,玩起来很流畅。看下面的代码。
def checkToken(userToken: String): Boolean = {
var status = false
Tokens.getToken(userToken).map(
token => {
if (token.isDefined && token.get.status.equals("ACTIVE")) {
status = true
println("--------------------------------- if: "+status+" -----------------------------")
} else {
status = false
println("--------------------------------- else: "+status+" -----------------------------")
}
}
)
println("---------------------------------status: "+status+"-----------------------------")
return status
}
执行上面的代码时会显示以下输出
---------------------------------status: false-----------------------------
--------------------------------- if: true -----------------------------
但输出应该是[对于有效令牌,两者都应为真]
---------------------------------status: true-----------------------------
--------------------------------- if: true -----------------------------
上面的代码有什么问题?
您遇到了时间问题。
如果 getToken
returns 一个 Future
,当您的 "main" 线程到达 Tokens.getToken(userToken)
时,它将在另一个线程上执行它。与此同时,主线程继续移动,在它真正来得及改变之前到达print("status"+status)
,函数returns。只有这样 Future
returns 才会在某个时候执行,并且仍然在那个单独的线程上,将执行 map
内的代码并更改 status
.[=19= 的值]
我认为你想要的是 returns 一个 Future[Boolean]
的函数(编辑以匹配@rethab 建议):
def checkToken(userToken: String): Future[Boolean] = Tokens.getToken(userToken).map(_.contains("ACTIVE"))
我是 SCALA 语言的新手,正在制作一个 API 服务,玩起来很流畅。看下面的代码。
def checkToken(userToken: String): Boolean = {
var status = false
Tokens.getToken(userToken).map(
token => {
if (token.isDefined && token.get.status.equals("ACTIVE")) {
status = true
println("--------------------------------- if: "+status+" -----------------------------")
} else {
status = false
println("--------------------------------- else: "+status+" -----------------------------")
}
}
)
println("---------------------------------status: "+status+"-----------------------------")
return status
}
执行上面的代码时会显示以下输出
---------------------------------status: false-----------------------------
--------------------------------- if: true -----------------------------
但输出应该是[对于有效令牌,两者都应为真]
---------------------------------status: true-----------------------------
--------------------------------- if: true -----------------------------
上面的代码有什么问题?
您遇到了时间问题。
如果 getToken
returns 一个 Future
,当您的 "main" 线程到达 Tokens.getToken(userToken)
时,它将在另一个线程上执行它。与此同时,主线程继续移动,在它真正来得及改变之前到达print("status"+status)
,函数returns。只有这样 Future
returns 才会在某个时候执行,并且仍然在那个单独的线程上,将执行 map
内的代码并更改 status
.[=19= 的值]
我认为你想要的是 returns 一个 Future[Boolean]
的函数(编辑以匹配@rethab 建议):
def checkToken(userToken: String): Future[Boolean] = Tokens.getToken(userToken).map(_.contains("ACTIVE"))