2017-09-04 2 views
1

je la méthode d'essai suivanteGestion des exceptions avec Scala futur scénario n'a

def test() = { 
val aa = Future{10} map { 
    case x if x%2 == 0 => (x,x) 
    case _ => val kk = Future.failed(BadRequestException("dd")); kk 
} 
aa 
} 

Si je supprime le case _ alors le type de retour méthode est Future[(Int, Int)] ce qui est exactement ce que je veux. Cependant, quand j'ajoute le scénario case _ le type de retour devient Future[Object]. Je ne suis pas en mesure de comprendre ce que dois-je changer que d'autres méthodes similaires dans notre base de code font des choses similaires (je suis sûr que je manque quelque chose de subtil) et le type de retour reste de la nature Future[(Int, Int)]. Après tout, quand je lance une exception pour un scénario, je ne voudrais pas que le type de retour de la méthode soit changé. Qu'est-ce que je manque ou fais mal?

Répondre

3

vous devez utiliser flatMap au lieu de map comme indiqué ci-dessous. avec map procédé du type de retour case _ est Future[BadRequestException] et pour case x if x%2 == 0 le type de retour est (Int, Int). Cela vous conduit à avoir un type de retour net de Future[Object]. Cela peut être corrigé en utilisant le flatMap au lieu de map comme indiqué ci-dessous.

def test() = Future{10} flatMap { 
    case x if x%2 == 0 => Future.successful((x,x)) 
    case _ => Future.failed(BadRequestException("dd")) 
} 
+0

oh Bonne prise, je l'ai maintenant, à tuple plutôt que de retour, je peux retourner l'avenir de celui-ci, puis flatMapping il prend soin de lui, sinon je vais me 'avenir [Future..'. Je comprends cette partie. Ce que je ne comprends toujours pas, c'est pourquoi le compilateur est content maintenant et accepte le type de retour que je veux. – curiousengineer

+0

parce que dans les deux cas, les types de retour sont 'Future [(Int, Int)]' et 'avenir [BadRequestException]' et l'union de ce type de retour est 'Future [(Int, Int)]'. alors que dans votre opération de carte d'origine deux types de retour étaient 'Future [(Int, Int)]' et 'Future [Future [BadRequestException]]' qui se traduit par un type d'union de 'Future [Object]' –

+0

Où puis-je lire à ce sujet? un peu plus. Merci beaucoup pour cette explication concise et claire. Je veux en savoir plus sur les types de syndicats aboutissent à quel type ultime – curiousengineer