1

我有下面的代码返回Future[Option[Password]]

db.run(passwords.filter {
      x => x.providerID === loginInfo.providerID && x.providerKey === loginInfo.providerKey
    }.result.headOption)

我想要做的是在下面的伪代码中:

if above query returns no results
  do nothing
else
  return new PasswordInfo(abovequeryresult.hasher, abovequeryresult.password, abovequeryresult.salt)

我是 Scala 新手,对此一无所知。尝试flatMap在下面的示例中使用,但flatMap上面的签名db.run()不同。

find(loginInfo).flatMap {
      case Some(_) => update(loginInfo, authInfo)
      case None => add(loginInfo, authInfo)
    }

我正在使用 Play Slick 版本 1.1.1

4

1 回答 1

0

我认为您的问题与如何在 Scala 中操作Futures更相关。如果您的db.run代码在 Play Controller 的操作中运行,最好的选择是将操作声明为async并将查询结果映射到play.api.mvc.Result. 像这样的东西:

def someAction = Action.async {
  find(loginInfo).map {
    case Some(authInfo) => 
      update(loginInfo, authInfo)
      Ok("Updated AuthInfo")               //Return a play.api.mvc.Resul 
    case None => 
      add(loginInfo, authInfo)
      Created("CreatedAuthInfo")           //Return another play.api.mvc.Resul
  }
}

或者如果你只想要结果

val future = find(loginInfo)
future.onSuccess {
  case Some(authInfo) => update(loginInfo, authInfo)
  case None => add(loginInfo, authInfo)
}
Await.ready(future, Duration.Inf)
于 2016-02-13T18:48:04.920 回答