我最近阅读了Manuel Bernhardt的新书Reactive Web Applications.在他的书中,他指出Scala开发人员永远不应该使用.get来检索可选值.
我想提出他的建议,但我正在努力避免.get使用期货的理解.
假设我有以下代码:
for {
avatarUrl <- avatarService.retrieve(email)
user <- accountService.save(Account(profiles = List(profile.copy(avatarUrl = avatarUrl)))
userId <- user.id
_ <- accountTokenService.save(AccountToken.create(userId, email))
} yield {
Logger.info("Foo bar")
}
Run Code Online (Sandbox Code Playgroud)
通常,我会用AccountToken.create(user.id.get, email)而不是AccountToken.create(userId, email).但是,当试图避免这种不良做法时,我得到以下异常:
[error] found : Option[Nothing]
[error] required: scala.concurrent.Future[?]
[error] userId <- user.id
[error] ^
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?
很多时候,当代码更改后Play重新加载应用程序时,我收到以下错误:
MongoError ['无法访问节点集!请检查您的网络连接.']
MongoDB日志如下所示:
2016-09-06T18:51:22.609+0200 I NETWORK [initandlisten] waiting for connections on port 27017
2016-09-06T18:53:49.916+0200 I NETWORK [initandlisten] connection accepted from 127.0.0.1:60559 #1 (1 connection now open)
2016-09-06T18:53:51.185+0200 I NETWORK [initandlisten] connection accepted from 127.0.0.1:60561 #2 (2 connections now open)
2016-09-06T18:53:51.196+0200 I NETWORK [initandlisten] connection accepted from 127.0.0.1:60562 #3 (3 connections now open)
2016-09-06T18:53:51.206+0200 I NETWORK [initandlisten] connection accepted from 127.0.0.1:60563 #4 (4 connections now open)
2016-09-06T18:53:51.217+0200 I NETWORK [initandlisten] connection accepted from 127.0.0.1:60564 #5 (5 connections now open)
2016-09-06T18:53:51.227+0200 …Run Code Online (Sandbox Code Playgroud) scala mongodb playframework reactivemongo play-reactivemongo
我目前升级到0.12.RC3,希望能解决我遇到的以下问题.升级后,我收到了该collect方法的弃用警告.
所以我离开了:
def find(query: JsObject = Json.obj())(implicit reader: Reads[T]): Future[List[T]] = {
collection.flatMap(_.find(query).cursor[T](ReadPreference.nearest).collect[List]())
}
Run Code Online (Sandbox Code Playgroud)
至:
def find(query: JsObject = Json.obj())(implicit reader: Reads[T]): Future[List[T]] = {
collection.flatMap(_.find(query).cursor[T](ReadPreference.nearest).collect[List](Int.MaxValue, Cursor.FailOnError()))
}
Run Code Online (Sandbox Code Playgroud)
但是,遗憾的是我收到以下错误:
类型不匹配,预期:(JSONCollection)=> Future [NotInferedS],actual:(JSONCollection)=> Any
我有一个处理表单提交的操作.在验证表格之前,我需要解决两个期货.我以为我可以嵌套所有东西,意思是把它fold放在yield理解的块内.
例如:
def handleFormSubmission = silhouette.SecuredAction.async { implicit request =>
for {
user <- userService.findOneByUserId(userId)
avatar <- avatarService.findOneByUserId(userId)
} yield {
myForm.bindFromRequest.fold(
formWithErrors => formWithErrorsBranch(formWithErrors, user, avatar),
changeData => changeDataBranch(changeData, user, avatar))
}
}
Run Code Online (Sandbox Code Playgroud)
两个分支都返回Future[Result]并且签名fold是def fold[R](hasErrors: Form[T] => R, success: T => R): R.据我了解,fold有两个功能与参数Form[T]和T与两者的回报R.这意味着如果我在两个分支中返回Future[Result],fold也会返回Future[Result].然而,由于它被包裹内的理解来解决这两个期货user和avatar,我就不需要具备Future[Result]而是Result.那是对的吗?如果是这样,我如何以非阻塞方式修复以下编译错误?
type mismatch;
found : …Run Code Online (Sandbox Code Playgroud)