2013-05-06 2 views
13

je le code suivant dans un acteurAkka: Envoyer un futur message à un acteur

def receive = { 
    case All() => { 
     val collection: BSONCollection = db("ping") 
     val future:Future[List[Ping]] = collection.find(BSONDocument()).cursor[Ping].toList() 
     val zender = sender 
     future onComplete { 
      case Success(list) => zender ! list 
      case Failure(throwable) => zender ! List() 
     } 
    } 
} 

Je n'aime pas comment je dois utiliser la fonction onComplete pour envoyer le résultat à l'acteur de l'expéditeur. Je voudrais savoir s'il est possible de le convertir en quelque chose comme ceci:

def receive = { 
    case All() => { 
     val collection: BSONCollection = db("ping") 
     val future:Future[List[Ping]] = collection.find(BSONDocument()).cursor[Ping].toList() 
     "sender ! future" // one option 
     "future.map(list => sender ! list)" //Another option. I know it's not map, but maybe another function   
    } 
} 

Je pense que cela coule mieux avec l'enchaînement avenir.

+0

votre première approche ne fonctionne-t-elle pas? –

+0

@Alex Oui, mais le tuyau est beaucoup plus élégant. – Luciano

+0

Très bien. Mais vous dites ** Je n'aime pas comment je dois utiliser la fonction onComplete pour renvoyer le résultat à l'acteur de l'expéditeur. ** et votre code fait exactement cela - vous renvoyez le résultat à l'acteur de l'expéditeur . –

Répondre

29

Vous pouvez utiliser le modèle de tuyau pour cela. Juste import akka.pattern.pipe et alors vous serez en mesure de transmettre des messages de futures aux acteurs avec future pipeTo actor.

+1

Oui, c'est ce que je cherchais, merci! – Luciano

11

Si vous souhaitez avoir une liste vide en cas d'échec, vous voulez probablement avoir des appels chaînés de "recover" et "pipeTo".

Questions connexes