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