qed qed - 2 months ago 21x
Scala Question

"Cannot find an implicit ExecutionContext" error in scala.js example app.

Here is an example from the Hands-on Scala.js ebook:

package webpage

import org.scalajs.dom.ext.Ajax

import scala.scalajs.js
import scala.scalajs.js.annotation.JSExport
import scalatags.JsDom.all._
import org.scalajs.dom
import dom.html

object HelloWorld1 extends {
def main(target: html.Div) = {

lazy val box = input(
placeholder:="Type here!"

lazy val output = div(

box.onkeyup = (e: dom.Event) => {
output.innerHTML = "Loading..."

h1("Weather Search"),
"Enter the name of a city to pull the ",
"latest weather data from api.openweathermap.com!"
hr, output, hr

def fetchWeather(query: String) = {
val searchUrl =
"http://api.openweathermap.org/data/" +
"2.5/find?type=like&mode=json&q=" +

xhr <- Ajax.get(searchUrl)
if query == box.value
} js.JSON.parse(xhr.responseText).list match{
case jsonlist: js.Array[js.Dynamic] =>
output.innerHTML = ""
showResults(jsonlist, query)
case _ =>
output.innerHTML = "No Results"
def showResults(jsonlist: js.Array[js.Dynamic], query: String) = {
for (json <- jsonlist) {
val name = json.name.toString
val country = json.sys.country.toString
val weather = json.weather.pop().main.toString

def celsius(kelvins: js.Dynamic) = {
kelvins.asInstanceOf[Double] - 273.15

val min = celsius(json.main.temp_min)
val max = celsius(json.main.temp_max)
val humid = json.main.humidity.toString
val (first, last) = name.splitAt(query.length)
b(span(first, backgroundColor:="yellow"), last, ", ", country),
li(b("Weather "), weather),
li(b("Temp "), min, " - ", max),
li(b("Humidity "), humid, "%")

Got an error when compiling:

[info] Compiling 1 Scala source to /Users/kaiyin/personal_config_bin_files/workspace/workbench-example-app/target/scala-2.11/classes...
[error] /Users/kaiyin/personal_config_bin_files/workspace/workbench-example-app/src/main/scala/HelloWorld1.scala:51: Cannot find an implicit ExecutionContext. You might pass
[error] an (implicit ec: ExecutionContext) parameter to your method
[error] or import scala.concurrent.ExecutionContext.Implicits.global.
[error] if query == box.value
[error] ^
[warn] /Users/kaiyin/personal_config_bin_files/workspace/workbench-example-app/src/main/scala/HelloWorld1.scala:53: non-variable type argument scala.scalajs.js.Dynamic in type pattern scala.scalajs.js.Array[scala.scalajs.js.Dynamic] is unchecked since it is eliminated by erasure
[warn] case jsonlist: js.Array[js.Dynamic] =>
[warn] ^
[warn] one warning found
[error] one error found
[info] workbench: Checking example-fastopt.js
[info] workbench: Checking webpage-fastopt.js
[error] (compile:compile) Compilation failed
[error] Total time: 0 s, completed 7 sept. 2015 12:51:38
78. Waiting for source changes... (press enter to interrupt)

What went wrong here?


As the error suggests, add the following imports:

import scala.concurrent._
import ExecutionContext.Implicits.global

or define an execution context implicitly that is in scope. You can define your own execution context as follows if you don't agree with the Typesafe default (ForkJoin pool):

import scala.concurrent._
val numberOfCPUs = sys.runtime.availableProcessors()
val threadPool = Executors.newFixedThreadPool(numberOfCPUs)
implicit val ec = ExecutionContext.fromExecutorService(threadPool)