Skip to content

Instantly share code, notes, and snippets.

@amazari
Last active December 14, 2015 20:18
Show Gist options
  • Save amazari/5142652 to your computer and use it in GitHub Desktop.
Save amazari/5142652 to your computer and use it in GitHub Desktop.
/*
Par exemple, dans le pseudo-code suivant, tous les appels sont asynchrones mais séquentiels
les uns par rapport aux autres.
Si l'un d'entre eux échoue, la chaine d'appels s'arrete et 'pictures' est lui-meme considéré
comme un echec et contient l'erreur/exception du point d'abandon.
*/
//'pictures' est ici une composition des différents appels différés (Future)
val pictures: Future[List[Picture]] = for {
userToken <- openIdProvider.auth (uri, secret, apiKey) // appel async distant
profile <- userService.profileFor(userToken) // appel async a notre BDD
pictures <- instagram.picturesFor (profile.instagramLogin) // appel async distant
} yield pictures
// Association de comportement en cas de succes ou echec de la chaine async
pictures onComplete {
case Success(pictures) => for (picture <- pictures) display(picture)
// t est l'exception levee a tout moment dans la chaine (probleme d'auth openid || profil non existant || souci instagram )
case Failure(t) => println("An error has occured: " + t.getMessage)
}
// La definition precedente ne bloque pas et l'exection continue normalement
doSomethingElse()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment