diff options
Diffstat (limited to 'examples/scala-js/library/src/main/scala/scala/scalajs/concurrent')
3 files changed, 55 insertions, 0 deletions
diff --git a/examples/scala-js/library/src/main/scala/scala/scalajs/concurrent/JSExecutionContext.scala b/examples/scala-js/library/src/main/scala/scala/scalajs/concurrent/JSExecutionContext.scala new file mode 100644 index 0000000..c159dcb --- /dev/null +++ b/examples/scala-js/library/src/main/scala/scala/scalajs/concurrent/JSExecutionContext.scala @@ -0,0 +1,24 @@ +package scala.scalajs.concurrent + +import scala.concurrent.ExecutionContext + +/** + * Execution contexts for use in JavaScript + * + * Enables the use of Futures/Promises + * @author Tobias Schlatter + */ +object JSExecutionContext { + + /** execution context that runs immediately. beware of stack growth! */ + val runNow = RunNowExecutionContext + /** execution context that submits into the JavaScript runtime's + * task queue */ + val queue = QueueExecutionContext + + object Implicits { + implicit val runNow: ExecutionContext = JSExecutionContext.runNow + implicit val queue: ExecutionContext = JSExecutionContext.queue + } + +} diff --git a/examples/scala-js/library/src/main/scala/scala/scalajs/concurrent/QueueExecutionContext.scala b/examples/scala-js/library/src/main/scala/scala/scalajs/concurrent/QueueExecutionContext.scala new file mode 100644 index 0000000..1f2ee6f --- /dev/null +++ b/examples/scala-js/library/src/main/scala/scala/scalajs/concurrent/QueueExecutionContext.scala @@ -0,0 +1,17 @@ +package scala.scalajs.concurrent + +import scala.concurrent.ExecutionContext +import scalajs.js + +private[concurrent] object QueueExecutionContext extends ExecutionContext { + + def execute(runnable: Runnable) = { + val lambda: js.Function = () => + try { runnable.run() } catch { case t: Throwable => reportFailure(t) } + js.Dynamic.global.setTimeout(lambda, 0) + } + + def reportFailure(t: Throwable) = + Console.err.println("Failure in async execution: " + t) + +} diff --git a/examples/scala-js/library/src/main/scala/scala/scalajs/concurrent/RunNowExcecutionContext.scala b/examples/scala-js/library/src/main/scala/scala/scalajs/concurrent/RunNowExcecutionContext.scala new file mode 100644 index 0000000..ba113b4 --- /dev/null +++ b/examples/scala-js/library/src/main/scala/scala/scalajs/concurrent/RunNowExcecutionContext.scala @@ -0,0 +1,14 @@ +package scala.scalajs.concurrent + +import scala.concurrent.ExecutionContext + +private[concurrent] object RunNowExecutionContext extends ExecutionContext { + + def execute(runnable: Runnable) = + try { runnable.run() } + catch { case t: Throwable => reportFailure(t) } + + def reportFailure(t: Throwable) = + Console.err.println("Failure in async execution: " + t) + +} |