为什么编译器找不到导入Implicits.global的隐式ExecutionContext?

时间:2015-01-05 14:21:24

标签: scala akka

我有以下代码:

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
}

每当我尝试运行代码时,都会收到以下错误:

  

无法找到隐式ExecutionContext。

为什么呢?范围内是不是scala.concurrent.ExecutionContext.Implicits.global?当此导入直接添加到LocalStorage对象时,它可以工作(!)

但我失去了改变背景的可能性。因为我不希望每次都在全局运行此代码。由于这是akka应用程序和“生产”运行时的一部分,因此应该在某个调度程序上运行。仅用于测试我想在全局执行上下文中运行它。

我在这里错过了一些重要的概念,还是我的设计错了,我失去了这种灵活性?这个问题在哪里?!

1 个答案:

答案 0 :(得分:4)

ExecutionContextExecutor不同。您应该让方法接受implicit exec: ExecutionContextscala.concurrent.ExecutionContext),然后它会按预期运行。