stateless-future用于异步编程的纯函数风格Future
示例代码:
import scala.concurrent.duration._import scala.util.control.Exception.Catcherimport com.qifun.statelessFuture.Futureval executor = java.util.concurrent.Executors.newSingleThreadScheduledExecutor// Manually implements a stateless future, which is the asynchronous version of `Thread.sleep()`def asyncSleep(duration: Duration) = new Future[Unit] { import scala.util.control.TailCalls._ def onComplete(handler: Unit => TailRec[Unit])(implicit catcher: Catcher[TailRec[Unit]]) = { executor.schedule(new Runnable { def run() { handler().result } }, duration.length, duration.unit) done() }}// Without the keyword `new`, you have the magic version of `Future` constructor,// which enables the magic postfix `await`.val sleep10seconds = Future { var i = 0 while (i < 10) { println(s"I have sleeped $i times.") // The magic postfix `await` invokes the asynchronous method `asyncSleep`. // It looks like normal `Thread.sleep()`, but does not block any thread. asyncSleep(1.seconds).await i += 1 } i}// When `sleep10seconds` is running, it could report failures to this catcherimplicit def catcher: Catcher[Unit] = { case e: Exception => { println("An exception occured when I was sleeping: " + e.getMessage) }}// A stateless future instance is lazy, only evaluating when you query it.println("Before the evaluation of the stateless future `sleep10seconds`.")for (total <- sleep10seconds) { println("After the evaluation of the stateless future `sleep10seconds`.") println(s"I sleeped $total times in total.") executor.shutdown()}输出结果:
Before evaluation of the stateless future `sleep10seconds`.I have sleeped 0 times.I have sleeped 1 times.I have sleeped 2 times.I have sleeped 3 times.I have sleeped 4 times.I have sleeped 5 times.I have sleeped 6 times.I have sleeped 7 times.I have sleeped 8 times.I have sleeped 9 times.After evaluation of the stateless future `sleep10seconds`.I sleeped 10 times in total.
评论