2

monix を使用して特定の操作を並列化し、エラー処理を実行しようとしています。

このようないくつかのオブジェクトを解析して検証しようとしているとしましょう

def parseAndValidateX(x: X) Task[X]

def parseAndValidateY(y: Y): Task[Y]

ここで、X と Y は、私が定義した型です。

現在、これらの各メソッドはいくつかの基準を評価し、Task を返します。評価が失敗した場合、フォームのコードがいくつかあります

Task.raiseError(new CustomException("X is invalid because certain reasons a,b,c"))

Yにも同様のタスクレイズがあります。

Task.raiseError(new CustomException("Y is invalid because certain reasons a',b',c'"))

今はこのタイプです

case class Combined(x: X, y: Y)

そして私はこれを定義しました

private def parseAndValidateCombined(x: X, y: Y): Task[Combined] = {
  val xTask = parseAndValidateX(x)
  val yTask = parseAndValidateY(y)
     
  Task.parMap2(xTask, yTask) {
    (xEval, yEval) => SecretData(xEval, yTask)
  }
}

これにより、検証を並行して実行できるようになり、十分な応答を得ることができます。

ただし、この動作も必要です

両方のタスクが失敗した場合、このようなエラーを返したい

Task.raiseError(new CustomException("X is invalid because certain reasons a,b,c and "Y is invalid because certain reasons a',b',c'"))

私はこれを行うことができないようです。2 つのタスクのどちらが失敗したかに応じて、parMap2 出力の onRecover メソッドで 2 つの失敗のうちの 1 つしか取得できません。

両方が失敗した場合、タスク X のエラーのみが表示されます。

Monix で行っていることを完全に非同期の方法で達成することは可能ですか (たとえば、タスクを一緒に構成する他の方法など)? または、exec をブロックし、エラーを個別に取得して、値を再構成する必要がありますか?

4

1 に答える 1