在scala播放框架异步操作中组合/链接未来

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在scala播放框架异步操作中组合/链接未来相关的知识,希望对你有一定的参考价值。

我是一个scala新手试图使用play框架编写Rest Api。我有以下3种数据访问方法

getDataDict: (dsType:String, name:String) => Future[Option[DatasetDictionary]]
getDatasetData: (DatasetDictionary) => Future[List[DatasetData]]
getMetadata: (DatasetDictionary) => Future[List[Metadata]]

我需要使用这3种方法来获取异步操作方法的结果。

 def index(dstype:String, name:String, metadata:Option[Boolean]) = Action.async{   
  /*
     1. val result = getDataDict(type, name)
     2. If result is Some(d) call getDatasetData
     3.1 if metadata = Some(true)
          call getMetadata function
          return Ok((dict, result, metadata))
     3.2 if metadata is None or Some(false)
          return Ok(result)
     4. If result is None
               return BadRequest("Dataset not found")
 */  
}

我按照以下步骤操作了第1步和第2步

def index1(dsType:String, dsName: String, metadata:Option[Boolean]) = Action.async {
    getDataDict(dsType, dsName) flatMap {
        case Some(x) => getDatasetData(x) map (x => Ok(Json.toJson(x)))
        case None => Future.successful(BadRequest("Dataset not found"))
      }
}

我坚持如何让元数据部分工作。

答案

首先,你真正想要回归的不是很清楚(d,结果,x)。希望我猜对了:

 def index(dstype:String, name:String, metadata:Option[Boolean]) = Action.async {
    getDataDict(dstype, name) flatMap {
      case Some(datasetDictionary) =>
        getDatasetData(datasetDictionary) flatMap { datasetDataList =>
          if (metadata == Some(true)) {
            getMetadata(datasetDictionary) map { metadataList =>
              Ok(Json.toJson((datasetDictionary, datasetDataList, metadataList)))
            }
          } else {
            Future.successful(Ok(Json.toJson(datasetDataList)))
          }
        }
      case None => Future.successful(BadRequest("Dataset not found"))
    }
  }

以上是关于在scala播放框架异步操作中组合/链接未来的主要内容,如果未能解决你的问题,请参考以下文章

组合框架序列化异步操作

在 Java 中播放框架异步处理和阻塞 I/O

twitter4s:如何在播放框架中从 Action.async 返回未来

组合框架:如何在继续之前异步处理数组的每个元素

如何在所有执行上下文的播放框架日志中记录请求 ID

我将如何在播放框架 2.4.3 (Scala) 中实现拦截器/过滤器