【问题标题】:Why can't the compiler find implicit ExecutionContext with Implicits.global imported?为什么编译器找不到导入 Implicits.global 的隐式 ExecutionContext?
【发布时间】:2015-01-06 05:31:49
【问题描述】:

我有以下代码:

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 应用程序的一部分,并且对于“生产”运行时,它应该在某个调度程序上运行。只是为了测试,我想在全局执行上下文中运行它。

我是否在这里遗漏了一些重要的概念,或者我的设计错了,我失去了这种灵活性?问题出在哪里?!

【问题讨论】:

    标签: scala akka


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我的失明!就是这样
    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 2017-12-03
    • 2013-06-22
    • 2023-03-13
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多