Last active
August 29, 2015 14:20
-
-
Save v6ak/dde38fe94bd98a26724f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
scala> import scala.concurrent._ | |
import scala.concurrent._ | |
scala> // Nadefinujeme funkci plus. Ta chce kromě hodnot ke sčítání také ExecutionContext, který určuje, | |
//kde se to vykoná. | |
scala> def plus(x: Int, y: Int)(implicit ec: ExecutionContext) = Future{x+y} | |
plus: (x: Int, y: Int)(implicit ec: scala.concurrent.ExecutionContext)scala.concurrent.Future[Int] | |
scala> // Podobně nadefinujeme i sum. Bude pracovat se spojovými seznamy. Bacha při kopírování na | |
// znaky „|“, ty nekopíruj, tím jen Scala značí, že ode mne ještě nějaký vstup očekává. | |
scala> def sum(xs: List[Int])(implicit ec: ExecutionContext): Future[Int] = xs match { | |
| case x::y::xs => plus(x, y).flatMap{r => sum(r::xs)} | |
| case x::Nil => Future.successful(x) | |
| case Nil => Future.successful(0) | |
| } | |
sum: (xs: List[Int])(implicit ec: scala.concurrent.ExecutionContext)scala.concurrent.Future[Int] | |
scala> // Nyní máme nadefinováno. Můžeme použít. Nejdříve budeme potřebovat nějaký ExecutionContext, | |
// použijeme tedy ten defaultní. | |
scala> import scala.concurrent.ExecutionContext.Implicits.global | |
import scala.concurrent.ExecutionContext.Implicits.global | |
scala> // Necháme počítat… | |
scala> sum(List(1, 2, 3, 4, 5)) | |
res0: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@f51585e | |
scala> // Future se nám uložila do proměnné res0, protože jsme si nevybrali jiný název. | |
scala> // Podíváme se, jestli to už skončilo, jak případně dopadl výpočet (úspěch nebo výjimka) | |
// a jakou hodnotu to případně vrátilo. | |
scala> res0.value | |
res1: Option[scala.util.Try[Int]] = Some(Success(15)) | |
scala> // V praxi se (_: Future[_]).value ani isCompleted moc nepoužívá, spíše se používá | |
// onCompleted (asynchronní přístup), nebo Await.result (synchronní přístup, možno použít timeout), | |
// nebo se to nechá na vhodném frameworku… | |
scala> Můžeme použít foreach (případně velmi podobnou metodu onSuccess), který zavolá println, | |
// až to bude hotové. (V tomto případě ihned.) Bohužel ale tím neřešíme chyby. | |
scala> res0.foreach(println) | |
15 | |
scala> // Pak bychom tedy měli zaregistrovat i handler pro chybu… | |
scala> res0.onFailure{case e => println(s"FAILED: $e")} | |
scala> // Nebo můžeme obsloužit obě varianty jedním handlerem… | |
scala> import scala.util.{Try, Success, Failure} | |
import scala.util.{Try, Success, Failure} | |
scala> res0.onComplete{ | |
| case Success(value) => println(value) | |
| case Failure(e) => println(s"FAILED: $e") | |
| } | |
15 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment