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