2016-01-03 12 views
5

Mi piace come Scala è di tipo sicuro, ma un errore di runtime Continuo a correre in èCome gestire meglio Future.filter predicato non è errori di tipo soddisfatti

Future.filter predicate is not satisfied 

Posso capire perché sto ottenendo questo errore, sto solo cercando consigli su come risolvere al meglio questo errore e gestirlo con garbo o forse sto sbagliando?

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

Se l'account non è confermato, riceverò l'errore sopra riportato.

Avrei pensato che poiché c'è il rischio che il filtro fallisse, tale scala renderebbe quindi il valore di ritorno del rendimento un'opzione. No?

+0

come può restituire un opzione, se hai dichiarato il il tipo di risultato deve essere 'Result'? – Dima

+1

'recover' the' Future' per produrre un errore significativo. Non dovresti 'r' essere un' Futuro [Risultato] '? –

+0

@ m-z sì l'ho cambiato in futuro grazie. – Blankman

risposta

4

Probabilmente si desidera utilizzare un semplice flatMap in cui è possibile specificare un else caso:

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

Ma voglio gestirlo in un for-comp perché li sto usando attualmente. O semplicemente non è possibile? – Blankman

7

filter non ha senso per Future dal momento che il sistema di tipo non saprebbe cosa per tornare per la else caso, quindi non è sicuro fare affidamento su di esso (utilizzando un se-guard). Ma si può fare questo all'interno di un per-di comprensione per ottenere la stessa cosa:

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

(come la risposta di Jean Logeart, ma all'interno di una per-comprensione)