执行 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"))