scala之执行 play Future 查询时,scala 变量的值不会改变。为什么

exmyth 阅读:14 2025-01-19 22:14:33 评论:0

我是 SCALA 语言的新手,正在使用 play 和 slick 制作 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 ----------------------------- 

但输出应该是[对于有效 token ,两者都应该为真]

---------------------------------status: true----------------------------- 
--------------------------------- if: true ----------------------------- 

上面的代码有什么问题?

请您参考如下方法:

您遇到了时间问题。

如果 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")) 


标签:Scala
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号