首页 > 解决方案 > scala foreach 会阻塞吗?

问题描述

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

例如,在以下代码段中:

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

Future(1) 只有在 foreach 完成后才会评估吗?

标签: scalaforeach

解决方案


Future.foreachFuture表示“成功完成后调用以下代码”。所以println只会在mySeq完成后调用。这可能在Future(1)调用之前发生,但同样可能不会。

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

(感谢 Thilo 的更正)


推荐阅读