0

以下に問題の概要を説明しました。Methodは、非同期でcalculate実行される計算を表し、最後の 2 つの「サブ」計算の結果が渡されます。重要なのは、これらの計算を開始する前に、予備計算でブール値を返すことです。true の場合、計算は続行され、最終的に Future[Some[Result]] が返されます。予備計算が false を返す場合、Future[None] を返す必要があります。これは、計算が不要であることを示しています。この小さなアルゴリズムは、最大限に非同期にする必要があります。subCalc1subCalc2mainCalcisCalcNecessary

def isCalcNecessary:Future[Boolean] = ...
def subCalc1(param:Param):Future[SubResult1] = ...
def subCalc2(param:Param):Future[SubResult2] = ...
def mainCalc(subResult1:SubResult1, subResult2:SubResult2):Future[Result] = .

def calcute(param:Param):Future[Option[Result]] = for {
  necessary <- isCalcNecessary(param)
  if necessary // this illustration fails at runtime if 'necessary' is false
  subResult1 <- subCalc1(param)
  subResult2 <- subCalc2(param)
  result <- mainCalc(subResult1, subResult2)
} yield Some(result)

上記の図は、条件が満たされないNoSuchElementException: Future.filter predicate is not satisfied (Future.scala:312)場合、実行時に ( ) で失敗します。if necessary

このアルゴリズムをどのように記述しますか?

4

2 に答える 2

2

別のオプションは、for 内包表記をネストすることです

def calculate(param:Param):Future[Option[Result]] = for {
  necessary <- isCalcNecessary(param)
  endResult <- if (necessary) for {
      subResult1 <- subCalc1(param)
      subResult2 <- subCalc2(param)
      result     <- mainCalc(subResult1, subResult2)
    } yield Some(result)
    else future(None)
} yield endResult
于 2013-08-27T18:37:35.553 に答える