2016-01-03 9 views
5

Ich liebe, wie scala Typ ist sicher, aber ein Laufzeitfehler ich laufen immer in istWie man am besten Future.filter Prädikat nicht erfüllt Art Fehler

Future.filter predicate is not satisfied 

Ich sehe umgehen kann, warum ich diese Störung erhalte, nur nach Ratschlägen suchen, wie man diesen Fehler am besten umgeht und es elegant behandelt oder vielleicht mache ich das falsch?

Wenn das Konto nicht bestätigt wird, erhalte ich den obigen Fehler.

Ich hätte gedacht, dass, da es ein Potenzial für den Filter zu scheitern gibt, dass Scala dann den Rendite-Rückgabewert eine Option machen würde. Nein?

+0

Wie kann es eine Option zurückkehren, wenn Sie die deklarierte Ergebnistyp ist "Ergebnis"? – Dima

+1

"Recover" die 'Zukunft', um einen sinnvollen Fehler zu erzeugen. Sollte 'r' nicht ein' Future [Result] 'sein? –

+0

@ m-z ja ich habe es in eine Zukunft geändert danke. – Blankman

Antwort

4

Sie wollen wahrscheinlich ein einfaches flatMap, in dem verwenden, können Sie einen else Fall angeben:

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

Aber ich möchte das in einem for-comp handhaben, weil ich sie momentan verwende. Oder ist es einfach nicht möglich? – Blankman

7

filter macht keinen Sinn für Future machen, da das Typsystem würde nicht wissen, was für die else zurückzukehren Fall, so dass es unsicher ist, sich darauf zu verlassen (mit einem if-guard). Aber Sie können für Verständnis innerhalb eines dies tun, das Gleiche zu erreichen:

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

(als Jean Logeart Antwort, aber innerhalb von ein für Verständnis)