1

我是 Scala 的新手,我想问一个简单的问题。

我有一个返回的函数Future[Option[T]

def findOne(query: JsObject)(implicit reader: Reads[T]): Future[Option[T]] = {
    Logger.debug(s"Finding one: [collection=$collectionName, query=$query]")
    collection.find(query).one[T]
}

我必须返回Future[Option[PasswordInfo]]

我试过了:

def find(loginInfo: LoginInfo): Future[Option[PasswordInfo]] = {

    val result = find(Json.obj("loginInfo.providerID" -> loginInfo.providerID, "loginInfo.providerKey" -> loginInfo.providerKey))

    result.onSuccess{
      case something => Future.successful(Some(something).getOrElse(None))
    }
}

我的课:

case class PersistentPasswordInfo(
       loginInfo: LoginInfo,
       authInfo: PasswordInfo
       ) extends TemporalModel {
  override var created: Option[DateTime] = _
  override var updated: Option[DateTime] = _
  override var _id: Option[BSONObjectID] = _
}
4

1 回答 1

1

您需要映射 Future 以获取选项,然后映射选项以获取 PersistedPasswordInfo

def find(loginInfo: LoginInfo): Future[Option[PasswordInfo]] = {

    val result = find(Json.obj("loginInfo.providerID" -> loginInfo.providerID, "loginInfo.providerKey" -> loginInfo.providerKey))

    result.map(opt => opt.map(ppi => ppi.authInfo))
}

Future 和 Option 都是 Functor,它们实现了一个具有类似以下签名的方法映射(假设包含 Future 的类型 arg 是 A):

def map[B](f: A => B): Future[B]

所以上面的代码通过应用函数 Option[PersistentPasswordInfo] => Option[PasswordInfo] 来改变 Future

该函数是通过使用函数 PersistentPasswordInfo => PasswordInfo 对包含的选项应用映射来创建的

于 2015-11-12T15:56:13.673 回答