2017-12-21 6 views
0

저는 플레이 프레임 워크를 사용하여 나머지 API를 작성하려는 스케이프 초보자입니다. 다음 3 가지 데이터 액세스 방법이 있습니다스칼라 플레이 프레임 워크 비동기 액션에서 선물 결합/연결

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

내 비동기 작업 메서드의 결과를 얻으려면이 세 가지 방법을 사용해야합니다.

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") 
*/ 
} 

나는

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")) 
     } 
} 

나는 메타 데이터 부분이 작동하게하는 방법에 붙어있어 다음과 같이 작업 단계 1과 2를 얻었다.

+0

계속하려면'.flatMap'을 사용하고, for-comprehension – cchantep

답변

1

우선 무엇을 정말로 반환하고 싶은지는 분명하지 않습니다 (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")) 
    } 
    } 
관련 문제