16
Voici un exemple des mains sur ebook Scala.js:"Impossible de trouver une erreur ExecutionContext implicite" dans l'exemple d'application scala.js.
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
@JSExport
object HelloWorld1 extends {
@JSExport
def main(target: html.Div) = {
lazy val box = input(
`type`:="text",
placeholder:="Type here!"
).render
lazy val output = div(
height:="400px",
overflowY:="scroll"
).render
box.onkeyup = (e: dom.Event) => {
output.innerHTML = "Loading..."
fetchWeather(box.value)
}
target.appendChild(
div(
h1("Weather Search"),
p(
"Enter the name of a city to pull the ",
"latest weather data from api.openweathermap.com!"
),
p(box),
hr, output, hr
).render
)
def fetchWeather(query: String) = {
val searchUrl =
"http://api.openweathermap.org/data/" +
"2.5/find?type=like&mode=json&q=" +
query
for{
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
}.toInt
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)
output.appendChild(
div(
b(span(first, backgroundColor:="yellow"), last, ", ", country),
ul(
li(b("Weather "), weather),
li(b("Temp "), min, " - ", max),
li(b("Humidity "), humid, "%")
)
).render
)
}
}
}
}
obtenu une erreur lors de la compilation:
[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)
Qu'est-il arrivé ici?
Je crois que la première moitié de la réponse est correcte (IIRC, 'scala.concurrent.ExecutionContext.Implicits.global' est à' scala aliasé. scalajs.concurrent.JSExecutionContext.queue', ce que vous voulez), mais la seconde moitié ne l'est pas. Rappelez-vous, il s'agit d'une question Scala.js - pas de pools de threads, ou de threads d'ailleurs. C'est un moteur d'exécution mono-thread, donc c'est un environnement beaucoup plus simple ... –
@JustinduCoeur, je ne suis pas familier avec Scala.js. En tout cas, cela n'a pas de sens. L'environnement d'exécution de thread par défaut fourni en important l'implicite est celui d'un forkjoinpool avec le nombre de threads amorcé égal au nombre de processeurs sur la machine. Donc, si ce n'est pas la sémantique requise, la première partie est également erronée. Sentez-vous libre d'éditer la réponse complètement à ce que vous pensez devrait être la bonne réponse. –
Scala.js est une réimplémentation de l'environnement d'exécution Scala, à exécuter sur JavaScript au lieu de sur la machine virtuelle Java. Le seul environnement d'exécution de thread disponible est un thread unique spécial, puisque JavaScript est fondamentalement mono-thread - les choses comme les pools fork/join sont des non-sequiteurs, car ils sont spécifiques à la JVM. * Syntaxiquement *, vous devez toujours ajouter l'import d'un ExecutionContext, pour garder le compilateur Scala heureux, mais il n'y en a qu'une seule définition légitime ... –