在两个 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].