小编Joh*_*Doe的帖子

Scala用于理解期货和期权

我最近阅读了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)

我怎么解决这个问题?

scala playframework

6
推荐指数
1
解决办法
866
查看次数

Play重新加载应用程序时出现奇怪的MongoError(使用ReactiveMongo)

很多时候,当代码更改后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

5
推荐指数
1
解决办法
725
查看次数

升级到ReactiveMongo 0.12.RC3时类型不匹配

我目前升级到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

scala reactivemongo play-reactivemongo

2
推荐指数
1
解决办法
768
查看次数

如何包装Scala进行理解以解决围绕Play的Form折叠的Future?

我有一个处理表单提交的操作.在验证表格之前,我需要解决两个期货.我以为我可以嵌套所有东西,意思是把它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]并且签名folddef fold[R](hasErrors: Form[T] => R, success: T => R): R.据我了解,fold有两个功能与参数Form[T]T与两者的回报R.这意味着如果我在两个分支中返回Future[Result],fold也会返回Future[Result].然而,由于它被包裹内的理解来解决这两个期货useravatar,我就不需要具备Future[Result]而是Result.那是对的吗?如果是这样,我如何以非阻塞方式修复以下编译错误?

type mismatch;
 found   : …
Run Code Online (Sandbox Code Playgroud)

scala akka playframework playframework-2.2

0
推荐指数
1
解决办法
350
查看次数