scala блок foreach? - PullRequest
       3

scala блок foreach?

0 голосов
/ 11 февраля 2020

Я не могу найти какой-либо определенной документации о том, как foreach должен вести себя в Scala, когда речь идет о фьючерсах.

Например, в следующем фрагменте:

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

Будет ли будущее (1) оцениваться только после завершения foreach?

Ответы [ 3 ]

4 голосов
/ 11 февраля 2020

Future.foreach означает «вызов следующего кода после успешного завершения Future». Таким образом, println будет вызываться только после завершения mySeq. Это может произойти до вызова Future(1), но не может.

Обратите внимание, что Future(Seq(1,2,3,4)) выполняется асинхронно, даже если результат является константой. Если вы замените это на Future.successful(Seq(1,2,3,4)), то это немедленно завершится , а println произойдет до Future(1). Однако последующий вызов foreach все еще асинхронный и может завершиться после Future(1)

(Спасибо Тило за исправление)

2 голосов
/ 11 февраля 2020

Вы можете взглянуть на точную реализацию метода, она выглядит примерно так (в Scala 2.11, но не думайте, что она полностью изменилась по сравнению с версией):

def foreach[U](f: T => U)(implicit executor: ExecutionContext): Unit = onComplete { _ foreach f }

Как вы можете видеть он не блокируется и будет вызван после завершения Future. По сути, это просто syntacti c сахар для onComplete.

Надеюсь, эта помощь!

1 голос
/ 11 февраля 2020

Документация Future.foreach состояний

Асинхронно обрабатывает значение в будущем, как только оно станет доступным.

Future не имеет никаких методов блокировки, кроме result и ready, которые не должны использоваться напрямую.

...