我正在尝试实现一种方法,该方法通过重用基于userID检索单个用户的方法来检索所有用户,但无法确定类型不匹配。你能告诉我如何解决这个问题吗?
UserDAOImpl.scala:
def findAll: Future[Seq[User]] = {
val dbUsers: Future[Seq[DbUser]] = db.run(users.result)
dbUsers.map { dbUserSeq =>
dbUserSeq.map { dbUser => find(UUID.fromString(dbUser.userID)).value.get match {
case Success(Some(usr: User)) => usr
case _ => None
}}
}
}
我会省略find
的定义,因为它工作正常,但这是签名。
def find(userID: UUID): Future[Option[User]] = {
错误讯息:
found : Seq[Product with Serializable]
required: Seq[models.User]
dbUserSeq.map { dbUser =>
^
以防万一,用户的定义
private val users = TableQuery[UserTable]
任何建议都将不胜感激。
答案 0 :(得分:1)
以前的代码实际上有几个问题,下面的代码是我到目前为止提出的解决方案。也许不是最简单的,但它确实有效。
def findAll: Future[Seq[User]] = {
db.run(users.result).map { dbUserSeq =>
dbUserSeq.map { dbUser =>
val userFut: Future[Option[User]] = find(UUID.fromString(dbUser.userID))
Await.ready(userFut, Duration.Inf).value.get match {
case Success(Some(usr: User)) => usr
case _ => throw new RuntimeException
}
}
}
}
答案 1 :(得分:1)
非阻塞方法:
def findAll: Future[Seq[User]] = {
db.run(users.result)
.map(dbUserSeq =>
Future.sequence(dbUserSeq.map(dbUser => find(UUID.fromString(dbUser.userID))))
)
.flatMap(userFutSeq => // userFutSeq is a Future[Seq[Option[User]]]
userFutSeq.map(userSeq => userSeq.collect { case Some(u) => u })
)
}
上面的代码收集了找到的用户并忽略了其余用户。
除测试目的外,请避免使用Await
。使用期货时,请保持在Future
。