2017-03-20 8 views
0

의 미래를 피하기 위해 Yeild에서 미래를 반환 처리하는 더 좋은 방법 : - 이해를이에서스칼라 : 고려 아래 코드 미래

, 나는 '수율'를 사용하여 미래의 값을 얻기 위해 노력하고 있어요. 이제 yield 메소드에서 future를 반환하는 함수 fallbackResult를 호출하여 getData의 반환 유형이 'Future [Option [Int]]가 아닌'Future [Future [Option]] '이되도록 확인해야합니다. ]] '. 나는 이것을 어떻게 더 좋은 방법으로 만들 수 있을까? (I지도 & FlatMap 년대를 사용했지만 의한지도와 FlatMaps 중첩에 코드를 조금 추한)

def getData(): Future[Future[Option[Int]]] = { 

    /* These are two future vectors. Ignore the Objects */ 

    val substanceTableF: Future[Vector[OverviewPageTableRowModel]] = getSubstanceTable(substanceIds, propertyId, dataRange) 
    val mixtureTableF: Future[Vector[OverviewPageTableRowModel]] = getMixtureTableForSubstanceCombination(substanceIds, propertyId, dataRange) 

    /* I have put for yeild to get values from futures.*/ 
    for { 
     substanceTable <- substanceTableF 
     mixtureTable <- mixtureTableF 
    } yield { 
     if(substanceTable.isEmpty && mixtureTable.isEmpty) { 
      val resultF = fallbackResult() 
      resultF.map(result => {Some(result)}) 
     } else { 
      Future.successful(Some(100)) 
     } 
    } 
} 

private def fallbackResult(): Future[Int] = { 
    // This method returns future of int 
} 
+0

가능한 중복 https://stackoverflow.com/questions/40599279/scala-pattern-for-comprehension-that-yields-a-futurea –

답변

0

이드 내부의 코드를 넣어-coprehension을 위해 :

for { 
    substanceTable <- substanceTableF 
    mixtureTable <- mixtureTableF 
    result <- { 
    if (substanceTable.isEmpty && mixtureTable.isEmpty) 
     fallbackResult() 
    else 
     Future.successful(Some(100)) 
    } 
} yield result 
1

는 많은 방법에게 있습니다 이 문제를 해결하려면 중요한 것은 yield 논리를 for으로 이동하는 것입니다. 다음과 같이이 작업을 수행하는 한 가지 방법은 다음과 같습니다

for { 
    substanceTable <- substanceTableF 
    mixtureTable <- mixtureTableF 
    result <- (substanceTable.headOption orElse mixtureTable.headOption) 
       .map(_ => Future.successful(Some(100))) 
       .getOrElse(fallbackResult) 
} yield result