繁体   English   中英

嵌套期货响应与Play和ReactiveMongo的编译器错误

[英]Compiler error on nested futures response with Play and ReactiveMongo

我有一个mongo条目,其中一个字段是一个列表。 如果输入不存在,我想添加新的。 如果它存在,我想在列表中追加一个新元素。

最后,我想向客户端返回Ok,但只有在操作成功完成后才能返回。 不是严格的要求,但在我看来,这是对用户最有意义的。

这就是我目前所拥有的 - 它可以工作,但在更新时它会覆盖旧列表,而不是附加新元素。

def myMethod(value:String, value2:String) = Action {

  Async {
    val myElement = Json.obj(
      "key" -> value2
    )

    val myDBEntry = Json.obj(
      "key" -> value,
      "list" -> List(myElement)
    )

    collection.update(Json.obj("key" -> value), myDBEntry, upsert = true).map(lastError =>
      Ok("Mongo LastError: %s".format(lastError)))
  }
}

为了检查列表是否存在并附加元素/创建一个新列表,我开始使用类似的东西(这取代了之前代码中的collection.update块):

val futureResult:Future[Option[JsObject]] = collection.find(Json.obj("key" -> value)).one[JsObject]

futureResult.map { result =>

  if (result.isEmpty) {
      collection.insert(myDBEntry).map(lastError =>
        Ok("Mongo LastError: %s".format(lastError)))


  } else {
      //this not the correct command yet - but compiler already fails because method is not returning correct future 
      collection.update(Json.obj("key" -> value), myDBEntry, upsert = true).map(lastError =>
        Ok("Mongo LastError: %s".format(lastError)))
  }


}

但编译器似乎不喜欢这种嵌套:“类型不匹配,预期:未来[结果],实际:未来:[未来[SimpleResult [Nothing]]]”

无论如何我觉得这种方式有点尴尬,必须有一个更优雅的方式来解决这个问题,但我是Futures和ReactiveMongo的新手并且不知道。 我该如何解决?

编辑:我也发现了这篇文章但我认为在数据库操作完成之前返回响应并且我不希望这样。

尝试更改此行:

futureResult.map { result =>

对此:

futureResult.flatMap { result =>

当您在未来和地图块内部执行地图返回另一个未来时,您需要使用flatMap,因为它会使嵌套变平。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM