2015-09-07 1 views
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?

Répondre

42

Comme l'erreur indique, ajoutez les importations suivantes:

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

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 ... –

+0

@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. –

+1

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 ... –