【问题标题】:Value of a scala variable do not change while executing play Future query. Why?scala 变量的值在执行 play Future 查询时不会改变。为什么?
【发布时间】:2016-06-23 12:13:29
【问题描述】:

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

上面的代码有什么问题?

【问题讨论】:

    标签: scala playframework slick


    【解决方案1】:

    您遇到了时间问题。

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

    【讨论】:

    • 更简单:Tokens.getToken(userToken).map(_.contains("ACTIVE"))
    • 我觉得应该是Tokens.getToken(userToken).map(_.exists(_.status == "ACTIVE"))
    • 不确定你的意思,因为None.contains("ACTIVE") 将返回falseSome("ACTIVE").contains("ACTIVE") 将返回true
    • 好吧,我指的是包含以下内容的原始问题:token.get.status.equals("ACTIVE") 这意味着tokenOption[SomeTypeWithStringPropertyCalledStatus],而不是Option[String]。不知道 OP 如何没有注意到这一点并接受了答案。
    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 2022-07-04
    • 2021-12-18
    • 2014-11-15
    相关资源
    最近更新 更多