16
はハンズオンScala.jsのebookからの例です:コンパイルするときscala.jsのサンプルアプリケーションで「暗黙のExecutionContextが見つかりません」というエラーが発生しました。ここで
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
)
}
}
}
}
はエラーを得た:ここが間違っていた
[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)
何?
私は答えの前半は(IIRC、 'scala.concurrent.ExecutionContext.Implicits.global'が'スカーラにエイリアスされ正確であると信じています。 scalajs.concurrent.JSExecutionContext.queue'、あなたが望むものですが)、後半はそうではありません。これはScala.jsの質問です。スレッドプールやスレッドのようなものはありません。これはシングルスレッドの実行エンジンなので、もっとシンプルな環境です... –
@JustinduCoeur、私はScala.jsに精通していません。いずれにせよ、それは理にかなっていません。暗黙的にインポートすることによって提供されるデフォルトのスレッド実行環境は、スレッド数がマシン上のプロセッサーの数と等しいforkjoinpoolのものです。したがって、それが必要なセマンティクスでない場合、最初の部分も間違っています。正解と思われる内容を完全に編集してください。 –
Scala.jsは、Scalaランタイムを再実装したもので、JVMではなくJavascriptで動作します。 JVMに特有のものなので、JavaScriptは基本的にシングルスレッドであるため、利用可能なスレッド実行環境は特別なシングルスレッドのものです。フォーク/ジョインプールのようなものは非シーケンサです。 * Syntactically *、あなたはScalaコンパイラを幸せにするためにExecutionContextのインポートを追加する必要がありますが、その正当な定義は1つしかありません。 –