scala foreach 会阻塞吗?

foo*_*baz 0 foreach scala

我似乎找不到任何关于foreach当涉及 future 时 Scala 中应该如何表现的明确文档。

例如,在以下代码片段中:

def someMethod: Future[Int] = {
  val mySeq: Future[Seq[Int]] = Future(Seq(1,2,3,4))
  mySeq.foreach(x => println(x))
  Future(1)
}
Run Code Online (Sandbox Code Playgroud)

Future(1) 仅在 foreach 完成后才进行评估吗?

Tim*_*Tim 5

Future.foreach意思是“成功完成后调用以下代码Future”。所以只会在完成println后被调用。mySeq这可能发生在Future(1) is called, but equally it might not.

请注意,Future(Seq(1,2,3,4))即使结果是常量,也会异步执行。如果您将其替换为,Future.successful(Seq(1,2,3,4))则这将立即完成,并且println将在 之前发生Future(1)。然而随后的foreach调用仍然是异步的,并且可能在Future(1)

(感谢Thilo的指正)

  • 我认为,即使使用“Future.successful”,“foreach”仍将被分派到隐式 ExecutionContext,而不仅仅是在当前线程上运行。所以 `println` 仍然可以在 `Future(1)` 之后发生。不? (4认同)