Skip to content

Instantly share code, notes, and snippets.

@ababup1192
Last active June 24, 2019 19:13
Show Gist options
  • Save ababup1192/47477e376982f7a4d52d9f40ff8fa8dc to your computer and use it in GitHub Desktop.
Save ababup1192/47477e376982f7a4d52d9f40ff8fa8dc to your computer and use it in GitHub Desktop.
import scala.concurrent._
import scala.concurrent.duration.Duration
import ExecutionContext.Implicits.global
object Main extends App {
def foo(x: Int): Future[Int] =
Future {
println(s"x: $x")
Thread.sleep(300)
if(x < 3) x + 1
else throw new RuntimeException
}
println(Await.result(foo(0).flatMap(foo), Duration.Inf))
println(Await.result(foo(0).flatMap(foo).flatMap(foo).flatMap(foo), Duration.Inf))
}
/*
s: 0
s: 1
2
s: 0
s: 1
s: 2
s: 3
java.lang.RuntimeException
at Main$.$anonfun$foo$1(Main.scala:12)
at scala.runtime.java8.JFunction0$mcI$sp.apply(JFunction0$mcI$sp.java:23)
at scala.concurrent.Future$.$anonfun$apply$1(Future.scala:658)
at scala.util.Success.$anonfun$map$1(Try.scala:255)
at scala.util.Success.map(Try.scala:213)
at scala.concurrent.Future.$anonfun$map$1(Future.scala:292)
at scala.concurrent.impl.Promise.liftedTree1$1(Promise.scala:33)
at scala.concurrent.impl.Promise.$anonfun$transform$1(Promise.scala:33)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64)
at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
*/
scala> import scala.util.Try
import scala.util.Try
scala> import scala.util.Failure
import scala.util.Failure
scala> def foo(x: Int): Try[Int] = if(x < 3) Try(x + 1) else Failure(new RuntimeException)
foo: (x: Int)scala.util.Try[Int]
scala> foo(0).flatMap(foo)
res10: scala.util.Try[Int] = Success(2)
scala> foo(0).flatMap(foo).flatMap(foo)
res11: scala.util.Try[Int] = Success(3)
scala> foo(0).flatMap(foo).flatMap(foo).flatMap(foo)
res12: scala.util.Try[Int] = Failure(java.lang.RuntimeException)
scala> foo(0).flatMap(foo).flatMap(foo).flatMap(foo).flatMap(foo)
res13: scala.util.Try[Int] = Failure(java.lang.RuntimeException)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment