为什么编译器找不到导入 Implicits.global 的隐式 ExecutionContext?
Why can't the compiler find implicit ExecutionContext with Implicits.global imported?
我有如下一段代码:
import java.util.concurrent.Executor
import scala.concurrent.Future
trait Storage {
def store(location: String, content: Array[Byte])(implicit exec: Executor): Future[String]
}
object LocalStorage extends Storage {
override def store(location: String, content: Array[Byte])(implicit exec: Executor): Future[String] =
Future {
... do some stuff ...
"Hello"
}
}
下面是测试代码:
object LocalStorageTest extends App{
import scala.concurrent.ExecutionContext.Implicits.global
val testImage = AsyncWebClient get "some url"
val result = testImage.flatMap{content => LocalStorage.store("logo.png",content)}
val status =Await.result(result, 30 seconds)
println(status)
AsyncWebClient.shutDown
}
每当我尝试运行代码时,都会收到以下错误:
Cannot find an implicit ExecutionContext.
为什么? scala.concurrent.ExecutionContext.Implicits.global 不是已经在范围内了吗?当此导入直接添加到 LocalStorage
对象时,它有效 (!)
但是我失去了改变上下文的可能性。因为我不想每次都在全局上运行这段代码。由于这是 akka 应用程序的一部分,并且对于 "production" 运行时,它应该在某个调度程序上运行。只是为了测试,我想在全局执行上下文中运行它。
我是不是漏掉了一些重要的概念,或者是我的设计错误导致我失去了这种灵活性?问题出在哪里?!
ExecutionContext
与 Executor
不同。您应该让该方法接受一个 implicit exec: ExecutionContext
(scala.concurrent.ExecutionContext
),然后它将按照您的预期运行。
我有如下一段代码:
import java.util.concurrent.Executor
import scala.concurrent.Future
trait Storage {
def store(location: String, content: Array[Byte])(implicit exec: Executor): Future[String]
}
object LocalStorage extends Storage {
override def store(location: String, content: Array[Byte])(implicit exec: Executor): Future[String] =
Future {
... do some stuff ...
"Hello"
}
}
下面是测试代码:
object LocalStorageTest extends App{
import scala.concurrent.ExecutionContext.Implicits.global
val testImage = AsyncWebClient get "some url"
val result = testImage.flatMap{content => LocalStorage.store("logo.png",content)}
val status =Await.result(result, 30 seconds)
println(status)
AsyncWebClient.shutDown
}
每当我尝试运行代码时,都会收到以下错误:
Cannot find an implicit ExecutionContext.
为什么? scala.concurrent.ExecutionContext.Implicits.global 不是已经在范围内了吗?当此导入直接添加到 LocalStorage
对象时,它有效 (!)
但是我失去了改变上下文的可能性。因为我不想每次都在全局上运行这段代码。由于这是 akka 应用程序的一部分,并且对于 "production" 运行时,它应该在某个调度程序上运行。只是为了测试,我想在全局执行上下文中运行它。
我是不是漏掉了一些重要的概念,或者是我的设计错误导致我失去了这种灵活性?问题出在哪里?!
ExecutionContext
与 Executor
不同。您应该让该方法接受一个 implicit exec: ExecutionContext
(scala.concurrent.ExecutionContext
),然后它将按照您的预期运行。