2017-12-21 24 views
0

私は、プレイフレームワークを使用してレストアピを書こうとしているスカラ初心者です。私は次の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") 
*/ 
} 

私は、メタデータの一部の作業を取得する方法にこだわっている

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、result、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")) 
    } 
    } 
関連する問題