2017-03-20 6 views
0

の未来を避けるために、Yeildから将来を返す処理するためのより良い方法は、以下のコードを考えてみましょう: - 理解この中スカラ:未来

、私は「利回りについて」を使用して未来から値を取得しようとしています。今度はyieldメソッドで、未来を返す関数fallbackResultを呼び出すcheckを行う必要があります。したがって、getDataの戻り値の型は、Future [Option [Int [Int]]ではなく[Future [Future [Option [Int]]] ]] '。私はこれをより良い方法でどうしたらいいですか?

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

可能重複https://stackoverflow.com/questions/40599279/scala-pattern-for-comprehension-that-yields-a-futurea –

答えて

0

Idがために、coprehension内のコードを入れて(私が使用マップ& FlatMapのですが、原因マップとFlatMapsを入れ子にするコード少し醜いはなかったです)これを処理するために重要なのは、yieldロジックをforに移動することです。次のようにこれを行う1つの方法は次のとおりです。

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

を多くの方法があります。

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 
} 
関連する問題