我在为写期权和期货而挣扎。我有一个方法find
,它返回一个Future[Option[User]]
,我正在编写另一个函数,它调用这个函数,做一些事情,然后返回另一个Future[Option[User]]
。问题是我不能完全正确地得到签名。以下是一些方法:
def find(userID: BSONObjectID): Future[Option[User]]
def save(user: User): Future[User]
我想写的是:
def saveToken(token: String, id: BSONObjectID) = {
userDAO.find(id).map {
case Some(user) =>
userDAO.save(user.copy(newToken = Some(token))).map(u => Some(u))
case _ => None
}
}
我想我差不多有了。问题是目前的签名是Future[Object]
,但我需要它是Future[Option[User]]
。我的想法是,只有在找到用户的情况下,我才想在我的持久性层中向用户添加一个token
字段。如果用户不存在,我希望方法返回User
或None
(由id
标识)。
发布于 2018-04-10 00:20:25
问题在于case _
,它返回与case Some(user)
返回的内容不匹配的Option
。要匹配它们的返回类型,将默认情况返回为Future.successful(None)
,如下面的虚拟示例所示:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
case class User(name: String, newToken: Option[String])
val u1 = User("david", Some("t1"))
val u2 = User("rachel", Some("t2"))
List(Some(u1), Some(u2), None).map{
case Some(user) => Future{ user.copy(newToken = Some("ok")) }.map(Some(_))
case _ => None
}
// res1: List[Object] = List(Future(<not completed>), Future(<not completed>), None)
List(Some(u1), Some(u2), None).map{
case Some(user) => Future{ user.copy(newToken = Some("ok")) }.map(Some(_))
case _ => Future.successful(None)
}
// res2: List[scala.concurrent.Future[Option[User]]] = List(
// Future(<not completed>), Future(<not completed>), Future(Success(None))
// )
https://stackoverflow.com/questions/49743296
复制相似问题