如何在Scala/ReactiveMongo中映射两个`future`结果?

Amy*_*y B 2 scala future mongodb reactivemongo

我有一个用Play和ReactiveMongo编写的应用程序,我想要:

  • 有一个将landingPage文档插入MongoDB的操作.
  • 插入新的landingpage并等待插入.
  • 计算新的landingPage文档总数并将其返回给用户.

我有这个工作代码:

// Insert the landing page and wait for it to be inserted, so we can then get the new count of landing pages.
val futures = for {
  wr <- landingPagesCollection.insert(landingPage)
  count <- landingPagesCollection.count()
} yield count

futures.map { (count: Int) =>
  Created(Json.obj(
    "created" -> true,
    "landingPage" -> landingPage.toJson,
    "count" -> count
  ))
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常.但是,出于好奇,我想知道如何访问wr(WriteResult)值.当我将代码更改为:

val futures = for {
  wr <- landingPagesCollection.insert(landingPage)
  count <- landingPagesCollection.count()
} yield (wr, count)

futures.map { (wr: WriteResult, count: Int) =>
  Created(Json.obj(
    "created" -> true,
    "message" -> s"You created landing page ${landingPage.name} (${landingPage.jobNumber}). The Git URI is '${landingPage.gitUri}'.",
    "landingPage" -> landingPage.toJson,
    "count" -> count,
    "writeResult" -> wr
  ))
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

错误消息

任何人都可以解释如何访问wr地图功能?

Nya*_*vro 8

试着改变

futures.map { (wr: WriteResult, count: Int) =>
Run Code Online (Sandbox Code Playgroud)

至:

futures.map { case (wr: WriteResult, count: Int) =>
Run Code Online (Sandbox Code Playgroud)

要不就:

futures.map { case (wr, count) =>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • @AmyB第8.5节http://www.scala-lang.org/files/archive/spec/2.11/08-pattern-matching.html"匿名功能可以通过箱子的序列来定义" (2认同)

Łuk*_*asz 6

如果函数接受2个参数而不是元组,则使用的语法有效

list.map((a: Int, b: String) => ...)
Run Code Online (Sandbox Code Playgroud)

如果你需要一个元组,你可以这样做:

list.map(tuple: (Int, String) => {
   val (num, str) = tuple
   ...
})
Run Code Online (Sandbox Code Playgroud)

或者按照接受的答案中的建议传递部分功能.它将与参数匹配(它与元组匹配)并允许您稍后使用提取的值

list.map { case (a: Int, b: String) => ... }
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,需要花括号.

可以删除类型注释,因为编译器可以推断它们.