我应该如何在期货

时间:2016-07-12 16:13:35

标签: scala caching playframework

我想使用内置的playframework缓存API,但不确定如何在期货时缓存此Web服务请求。

def getUser(username: String): Future[Option[User]] = {
  ws.url("...").get.map { response =>
    response.json.validate[User] match {
       case JsSuccess(user, _) => Some(user)
       case JsError(errors) => {
           // log errors
           None
       }
    }
  }
}

缓存密钥只是现在的用户名。

我如何在这里使用缓存API?

我想使用getOrElse模式:

val user: User = cache.getOrElse[User]("item.key") {
  User.findById(connectedUser)
}

但是Future和Option让我对如何使用它感到困惑。

1 个答案:

答案 0 :(得分:1)

我会这样做:

def fromWebservice(username: String): Future[Option[User]] =
  ws.url("..").get.map(validate) // validate does the json validate thing

def getUser(username: String): Future[Option[User]] = 
  cache.getAs[User](username) match {
    case Some(x) =>
      Future.successful(Some(x))
    case None =>
      fromWebservice(username).map(_.map { user =>
        cache.set(username, user)
        x
      })
  }

另外,Play缓存API没有返回Future的API,但他们正在处理它:https://github.com/playframework/playframework/issues/5912