在两个 Action.async 块之间进行选择,为什么我不能在调用方中指定 Action.async?
Choosing between two Action.async blocks, why can't I specify Action.async in the caller?
在下面的第一行,我想知道是否有任何我可以或应该放在 =
左侧的内容,以防止将来出现不良编辑。我有一个 Action.async
,但现在我想有两个选择(运行 单个 MongoDB 查询或 运行 多个 MongoDB 查询)来得出答案到网络查询 q
。我的代码按原样编译,但我认为我应该在 =
之前添加一些内容以使代码更加类型安全。
def q(arg: String) =
if (wantMultipleQueriesByDataSource)
runMultipleQueriesByDataSource(arg)
else
runSingleQuery(arg)
def runSingleQuery(arg: String) = Action.async {
if (oDb.isDefined) {
val collection: MongoCollection[Document] = oDb.get.getCollection(collectionName)
val fut = getMapData(collection, arg)
fut.map { docs: Seq[Document] =>
val docsSources = List(DocsSource(docs, "*"))
val pickedDocs = pickDocs(args, docsSources)
Ok(buildQueryAnswer(pickedDocs))
} recover {
case e => BadRequest("FAIL(rect): " + e.getMessage)
}
}
else Future.successful(Ok(buildQueryAnswer(Nil)))
}
def runMultipleQueriesByDataSource(arg: String) = Action.async {
if (oDb.isDefined) {
val collection: MongoCollection[Document] = oDb.get.getCollection(collectionName)
val dataSources = List("apples", "bananas", "cherries")
val futureCollections = dataSources map { getMapDataByDataSource(collection, _, arg) }
Future.sequence(futureCollections) map {
case docsGroupedByDataSource: Seq[Seq[Document]] =>
val docsSources = (docsGroupedByDataSource zip dataSources) map {x => DocsSource(x._1, x._2)}
val pickedDocs = pickDocs(args, docsSources)
Ok(buildQueryAnswer(pickedDocs))
case _ => Ok(buildQueryAnswer(Nil))
} recover {
case e => BadRequest("FAIL(rect): " + e.getMessage)
}
}
else Future.successful(Ok(buildQueryAnswer(Nil)))
}
你不需要,因为 Scala 在这种情况下有 type inference。但如果你愿意,你可以将方法签名更改为以下内容:
def q(arg: String): Action[AnyContent]
我在这里假设您正在使用 Playframework。
Edit:事实上,在这种情况下,Action.async
return an Action[AnyContent]
并且它接收到一个块 returns a Future[Result]
.
在下面的第一行,我想知道是否有任何我可以或应该放在 =
左侧的内容,以防止将来出现不良编辑。我有一个 Action.async
,但现在我想有两个选择(运行 单个 MongoDB 查询或 运行 多个 MongoDB 查询)来得出答案到网络查询 q
。我的代码按原样编译,但我认为我应该在 =
之前添加一些内容以使代码更加类型安全。
def q(arg: String) =
if (wantMultipleQueriesByDataSource)
runMultipleQueriesByDataSource(arg)
else
runSingleQuery(arg)
def runSingleQuery(arg: String) = Action.async {
if (oDb.isDefined) {
val collection: MongoCollection[Document] = oDb.get.getCollection(collectionName)
val fut = getMapData(collection, arg)
fut.map { docs: Seq[Document] =>
val docsSources = List(DocsSource(docs, "*"))
val pickedDocs = pickDocs(args, docsSources)
Ok(buildQueryAnswer(pickedDocs))
} recover {
case e => BadRequest("FAIL(rect): " + e.getMessage)
}
}
else Future.successful(Ok(buildQueryAnswer(Nil)))
}
def runMultipleQueriesByDataSource(arg: String) = Action.async {
if (oDb.isDefined) {
val collection: MongoCollection[Document] = oDb.get.getCollection(collectionName)
val dataSources = List("apples", "bananas", "cherries")
val futureCollections = dataSources map { getMapDataByDataSource(collection, _, arg) }
Future.sequence(futureCollections) map {
case docsGroupedByDataSource: Seq[Seq[Document]] =>
val docsSources = (docsGroupedByDataSource zip dataSources) map {x => DocsSource(x._1, x._2)}
val pickedDocs = pickDocs(args, docsSources)
Ok(buildQueryAnswer(pickedDocs))
case _ => Ok(buildQueryAnswer(Nil))
} recover {
case e => BadRequest("FAIL(rect): " + e.getMessage)
}
}
else Future.successful(Ok(buildQueryAnswer(Nil)))
}
你不需要,因为 Scala 在这种情况下有 type inference。但如果你愿意,你可以将方法签名更改为以下内容:
def q(arg: String): Action[AnyContent]
我在这里假设您正在使用 Playframework。
Edit:事实上,在这种情况下,Action.async
return an Action[AnyContent]
并且它接收到一个块 returns a Future[Result]
.