【问题标题】:Function with Future return type always returns NoneFuture 返回类型的函数总是返回 None
【发布时间】:2017-10-03 18:27:08
【问题描述】:

我有以下功能:

//retrieves record from database
def getAll: Future[List[User]] = {
  try {
    Logger.info("Getting all user record.")
    db.run(userTableQuery.to[List].result)
  }
  catch {
    case ex: Exception => Logger.error("Exception in getting all user record. " + ex)
      Future {
        List[User]()
      }
  }
}


//checks whethe the email exist in list or not
def checkEmail(email : String): Future[Option[User]] ={
  /* userRepo.getAll.map(userList => userList.filter(user => user.email == email).map { value => println(value)
     userList
   })*/
  userRepo.getAll.map(userList => userList.filter(user => user.email == email).headOption)

}


//allows to sign in and redirects to dashboard
def signIn() = {
  Logger.debug("signingIn in progress. ")
  loginForm.bindFromRequest.fold(
    formWithErrors => {
      Logger.error("Sign-In badRequest.")
      Future(BadRequest(views.html.home(webJarAssets, formWithErrors, signUpForm)))
    },
    validData => {
      userService.checkEmail(validData.email).map(value => {
        value match {
          case Some(us) =>Redirect(routes.HomeController.homePage).flashing("ERROR" -> "User  exist")
          case None => Redirect(routes.HomeController.homePage).flashing("ERROR" -> "User doesn't exist")
        }
      }
      )
    }
  )
}

但是当我调用signin() 时,它总是返回None

我使用了一些调试器代码,我猜checkMail() 内的filter() 不能正常工作。 但是getall() 工作正常并提供数据库中的所有记录。

【问题讨论】:

  • 那么问题是什么?
  • userRepo.getAll 返回什么? userRepo 是您要展示其功能的类的实例吗?

标签: scala playframework


【解决方案1】:

我认为问题在于如何将用户电子邮件与 checkMail() 函数中过滤器内提供的电子邮件进行比较。 字符串相等有点棘手,如果您使用 == 比较它们,则您正在比较对象而不是值,因此您应该使用 .equals() 来比较值。 你可以阅读更多关于这个blog post

尝试像这样重写 checkMail():

  def checkEmail(email : String): Future[Option[User]] ={
      userRepo.getAll.map(userList => userList.filter(user => user.email.equals( email ) ).headOption)
  }

您还可以使用 find() 简化 .filter() 和 .headOption,它只在一个命令中执行相同的操作。你可以这样重写:

  def checkEmail(email : String): Future[Option[User]] ={
      userRepo.getAll.map(userList => userList.find(user => user.email.equals( email ) ) )
  }

【讨论】:

    【解决方案2】:

    您可以在 checkmail 下使用 find 方法,而不是使用过滤器。而且,由于这是你正确使用“==”的scala,请参阅博客here

    我希望这段代码能修复:

    //checks whethe the email exist in list or not
    def checkEmail(email : String): Future[Option[User]] ={
      /* userRepo.getAll.map(userList => userList.filter(user => user.email == email).map { value => println(value)
         userList
       })*/
      userRepo.getAll.map(userList => userList.find(user => user.email == email))
    
    }
    

    我尝试使用终端直接模拟/实验您的实现:

    scala> case class User(email: String)
    defined class User
    
    scala> import scala.concurrent.ExecutionContext.Implicits.global
    import scala.concurrent.ExecutionContext.Implicits.global
    
    scala> val allUser = scala.concurrent.Future {List(User("carl@test.com"), User("los@test.com"), User("pos@test.com"))}
    allUser: scala.concurrent.Future[List[User]] = scala.concurrent.impl.Promise$DefaultPromise@751d3241
    
    scala> val checkmail = allUser.map(userlist=>userlist.find(user=>user.email == "carl@test.com"))
    checkmail: scala.concurrent.Future[Option[User]] = scala.concurrent.impl.Promise$DefaultPromise@1358b28e
    
    scala> val rslt = checkmail.map(value => value match {case Some(x) =>println(x); x.email case None => println("None"); "nothing" })
    rslt: scala.concurrent.Future[Unit] = scala.concurrent.impl.Promise$DefaultPromise@18324f97
    User(carl@test.com)
    
    scala> import scala.concurrent.duration._
    import scala.concurrent.duration._
    
    
    scala> import scala.concurrent._
    import scala.concurrent._
    
    scala> Await.result(rslt, 3 seconds)
    warning: there was one feature warning; re-run with -feature for details
    res8: String = carl@test.com
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      相关资源
      最近更新 更多