Я интегрирую силуэт (ветвь securesocial) в свой проект в качестве библиотеки аутентификации, поэтому я следую его примеру проекта с slick play-silhouette-slick-seed.
При написании эти строки Я получаю много ошибок в eclipse.
def find(loginInfo: LoginInfo) = {
DB withSession { implicit session =>
Future.successful {
slickLoginInfos.filter(
x => x.providerID === loginInfo.providerID && x.providerKey === loginInfo.providerKey
).firstOption match {
case Some(info) =>
slickUserLoginInfos.filter(_.loginInfoId === info.id).firstOption match {
case Some(userLoginInfo) =>
slickUsers.filter(_.id === userLoginInfo.userID).firstOption match {
case Some(user) =>
Some(User(UUID.fromString(user.userID), loginInfo, user.firstName, user.lastName, user.fullName, user.email, user.avatarURL))
case None => None
}
case None => None
}
case None => None
}
}
}
}
[Ожидаются ошибки, так как пример проекта написан с использованием старых версий play и slick]
Я попытался перенести их, поэтому заменил withSession на run и firstOption на headOption, так как я прочитал в гладком официальном документе, что прежние устарели в slick 3.0. Ниже приведены мои изменения, но они все еще не работают.
def find(loginInfo: LoginInfo) = {
DB run {
Future.successful {
slickLoginInfos.filter(
x => x.providerID === loginInfo.providerID && x.providerKey === loginInfo.providerKey
).result.headOption match {
case Some(info) =>
slickUserLoginInfos.filter(_.loginInfoId === info.id).result.headOption match {
case Some(userLoginInfo) =>
slickUsers.filter(_.id === userLoginInfo.userID).result.headOption match {
case Some(user) =>
Some(User(UUID.fromString(user.userID), loginInfo, user.firstName, user.lastName, user.fullName, user.email, user.avatarURL))
case None => None
}
case None => None
}
case None => None
}
}
}
}
Я новичок в игре и scala, каждый день изучаю новые вещи. Не могли бы вы помочь мне в исправлении этих ошибок. Было бы неплохо, если бы кто-нибудь также объяснил мне использование будущих значений, чем они отличаются от обычных значений, которые мы получаем с помощью Await (db.run(....)), и как анализировать value внутри будущего объекта, так как я видел, что в некоторых местах они используют карту, а в некоторых местах они используют onSuccess или case, это довольно запутанно. Как лучше всего работать с будущими ценностями?