2015-09-07 15 views
16

Oto przykład z hands-on Scala.js ebook:"Nie można znaleźć niejawnego błędu wykonania" w przykładowej aplikacji 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 
     ) 
     } 
    } 
    } 
} 

masz błąd podczas kompilacji:

[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) 

Co poszło nie tak tutaj?

Odpowiedz

42

Jak sugeruje błąd, należy dodać następujące importu:

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

Uważam, że pierwsza połowa odpowiedź jest poprawna (IIRC, 'scala.concurrent.ExecutionContext.Implicits.global' jest synonim' scala. scalajs.concurrent.JSExecutionContext.queue', czego właśnie chcesz), ale druga połowa nie jest. Pamiętaj, że jest to pytanie dotyczące Scala.js - nie ma czegoś takiego jak pule wątków lub wątki w tym zakresie. Jest to jednowątkowy silnik wykonawczy, więc jest to znacznie prostsze środowisko ... –

+0

@JustinduCoeur, nie znam Scala.js. W każdym razie nie ma to sensu. Domyślnym środowiskiem wykonywania wątków dostarczanym przez import pliku niejawnego jest plik forkjoinpool z liczbą wątków zagruntowanych równą liczbie procesorów na komputerze. Więc jeśli nie jest to wymagana semantyka, pierwsza część również jest błędna. Możesz całkowicie edytować odpowiedź na to, co według Ciebie powinno być właściwą odpowiedzią. –

+1

Scala.js to reimplementacja środowiska uruchomieniowego Scala do uruchamiania na JavaScript zamiast na JVM. Jedynym dostępnym środowiskiem wykonywania gwintów jest specjalny, jedno-wątkowy, ponieważ JavaScript jest w zasadzie jednoprzekrojowy - rzeczy takie jak pule łączenia/łączenia nie są sekwariantami, ponieważ są specyficzne dla maszyny JVM. * Syntaktycznie *, nadal musisz dodać import Kontraktu Wykonawczego, aby kompilator Scala był szczęśliwy, ale istnieje tylko jedna prawidłowa definicja tego ... –

Powiązane problemy