2016-01-03 13 views
5

ではありませんこのエラーを回避して正常に処理する方法や、間違ってやっている可能性があります。は、私はこのエラーを取得していますなぜ私は、見ることができますScalaはタイプセーフですが、私はに実行し続ける1つのランタイムエラーが</p> <pre><code>Future.filter predicate is not satisfied </code></pre> <p>がいかに愛する満足型エラー

val r: Future[play.api.mvc.Result] = for { 
    account <- accountServer.get(...) 
    if account.isConfirmed 
    orders <- orderService.get(account, ...) 
} yield { 
    ... 
} 

アカウントが確認されない場合は、上記のエラーが発生します。

私は、フィルタが失敗する可能性があるので、スカラがyield戻り値をOptionにすると考えました。いいえ?

+0

(ジャン・Logeartの答えとしてではなく、ため-理解以内):しかし、あなたは同じことを達成するために、理解の中にこれを行うことができます結果の型は 'Result'になりますか? – Dima

+1

意味のあるエラーを生成するために 'Future'を' recover'します。 'r'は' Future [Result] 'ではないでしょうか? –

+0

@ m-zはい私はそれを将来の感謝に変えました。 – Blankman

答えて

4

あなたはおそらく、あなたがelseケースを指定することができ、単純なflatMapを使用したい:型システムがelseのために返すために何を知ることはできませんので、

val orders = accountServer.get(...) 
          .flatMap { account => 
          if(account.isConfirmed) orderService.get(account, ...) 
          else Future.successful(Seq.empty) 
          } 
+0

しかし、私はfor-compでこれを扱いたいのですが、私は現在それらを使用しています。それとも不可能なのでしょうか? – Blankman

7

filterFutureのために意味がありません。大文字と小文字を区別しないので、if-guardを使用することは危険です。

val r: Future[play.api.mvc.Result] = for { 
    account <- accountServer.get(...) 
    orders <- if (account.isConfirmed) orderService.get(account, ...) 
      else Future.successful(Seq.empty) 
} yield { 
    ... 
} 

あなたが宣言した場合にどのようにそれは、オプションを返すことができ

関連する問題

 関連する問題