2015-09-07 9 views
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) 

何?

答えて

42

エラーが示すように、次のインポートを追加します。

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

私は答えの前半は(IIRC、 'scala.concurrent.ExecutionContext.Implicits.global'が'スカーラにエイリアスされ正確であると信じています。 scalajs.concurrent.JSExecutionContext.queue'、あなたが望むものですが)、後半はそうではありません。これはScala.jsの質問です。スレッドプールやスレッドのようなものはありません。これはシングルスレッドの実行エンジンなので、もっとシンプルな環境です... –

+0

@JustinduCoeur、私はScala.jsに精通していません。いずれにせよ、それは理にかなっていません。暗黙的にインポートすることによって提供されるデフォルトのスレッド実行環境は、スレッド数がマシン上のプロセッサーの数と等しいforkjoinpoolのものです。したがって、それが必要なセマンティクスでない場合、最初の部分も間違っています。正解と思われる内容を完全に編集してください。 –

+1

Scala.jsは、Scalaランタイムを再実装したもので、JVMではなくJavascriptで動作します。 JVMに特有のものなので、JavaScriptは基本的にシングルスレッドであるため、利用可能なスレッド実行環境は特別なシングルスレッドのものです。フォーク/ジョインプールのようなものは非シーケンサです。 * Syntactically *、あなたはScalaコンパイラを幸せにするためにExecutionContextのインポートを追加する必要がありますが、その正当な定義は1つしかありません。 –

関連する問題