2016-01-03 9 views
5

Uwielbiam sposób scala jest typu bezpieczne, ale jeden błąd wykonania Ciągle działa pod jestJak najlepiej poradzić Future.filter orzecznik nie jest zadowolony błędy typu

Future.filter predicate is not satisfied 

widzę dlaczego ja dostaję ten błąd, po prostu szukasz porady, jak najlepiej obejść ten błąd i poradzić sobie z nim z wdziękiem, czy może robię to źle?

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

Jeśli konto nie zostanie potwierdzone, otrzymam powyższy błąd.

Sądziłem, że skoro istnieje możliwość, że filtr się nie powiedzie, ta skala sprawi, że wartość zwrotu z zysku będzie opcją. Nie?

+0

Jak może powrócić opcję, jeśli uznał typ wyniku to "Wynik"? – Dima

+1

'odzyskaj' 'Przyszłość', aby wygenerować znaczący błąd. Czy 'r' nie powinien być' Przyszłością [Rezultatem] '? –

+0

@ m-z tak zmieniłem to na przyszłe dzięki. – Blankman

Odpowiedz

4

Prawdopodobnie chcesz użyć prostego flatMap w którym można określić else sprawy:

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

Ale chcę poradzić sobie z tym w for-comp, ponieważ używam ich obecnie. Czy to po prostu niemożliwe? – Blankman

7

filter nie ma sensu dla Future ponieważ system typu nie będzie wiedział, co do powrotu dla else przypadku, więc nie można polegać na nim (za pomocą strażnika). Ale można to zrobić w ciągu do-zrozumienia, aby osiągnąć to samo:

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

(jako odpowiedź Jean Logeart, ale w ciągu for-zrozumieniem)

Powiązane problemy