7

当我创建一个future或应用诸如onSuccessand之类的方法map时,我可以为它们指定 ExecutionContext。

例如,

val f = future {
  // code
} executionContext

f.map(someFunction)(executionContext)

f onSuccess {
  // code
} executionContext

但是,如果我使用对未来的理解,我如何为该yield部分指定 ExecutionContext?

for {
  f <- future1
  g <- future2
} yield {
  // code to be executed after future1 onSuccess and future2 onSuccess
  // What ExecutionContext runs this code?
} // (executionContext) here does not work

而且,如果未指定,什么 ExecutionContext 会在 yield 中运行代码?


编辑

好的。感谢答案,我发现了一些东西。
如果我不定义或导入隐式ExecutionContext(如Implicits.global),则 for-comprehension 不会编译。这意味着,理解使用隐式 ExecutionContext。

那么,如何在没有隐式ExecutionContext的情况下使用for-comprehension,即如何指定?

4

2 回答 2

9

参数ExecutionContext实际上是. implicit这意味着您可以:

import scala.concurrent.ExecutionContext

implicit val context = ExecutionContext.fromExecutor(//etc)
for {
  f <- future1
  g <- future2
} yield {
  // code to be executed after future1 onSuccess and future2 onSuccess
  // What ExecutionContext runs this code?: the one above.
}

您还有一个默认值,即scala.concurrent.ExecutionContext.Implicits.global. 它具有与运行机器上的处理器一样多的线程。

默认情况下,所有 Futures 都不会使用它,您仍然需要导入它。

更新:如果你真的想指定,虽然不推荐,你可以打开for yield

val combined = futureA.flatMap(x => futureB)(context)
于 2014-01-21T11:25:10.317 回答
1

由于for理解被“映射”到map/flatMap操作,并且这些ExecutionContext参数是隐式的,我想你可以尝试implicit val在本地范围内添加一个:

implicit val myContext:ExecutionContext = ...

.

我不相信有一个“默认”的implicit ExecutionContext,但最常用的是ExecutionContext.Implicits.global.

于 2014-01-21T11:26:16.777 回答