执行播放Future查询时,scala变量的值不会更改。为什么?

时间:2016-06-23 12:13:30

标签: scala playframework slick

我是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 -----------------------------

上述代码有什么问题?

1 个答案:

答案 0 :(得分:4)

你有时间问题。

如果getToken返回Future,当您的“主”线程到达Tokens.getToken(userToken)时,它将在另一个线程上执行它。与此同时,主线程继续移动,在实际有时间更改之前到达print("status"+status),函数返回。只有这样Future才会在某个时刻返回,并且仍然在该单独的线程上执行map内的代码并更改status的值。

我认为你想要的是一个返回Future[Boolean]的函数(编辑为匹配@rethab建议):

def checkToken(userToken: String): Future[Boolean] = Tokens.getToken(userToken).map(_.contains("ACTIVE"))