Акка-источник не передает данные? - PullRequest
0 голосов
/ 20 января 2019
val pageDataFutures : Seq[Future[PageData]]= ??? //4 api calls each resulting in a future of PageData

  def source : Source[PageData, NotUsed] = Source(
    pageDataFutures.flatMap(future => Await.result(future,atMost)).toList
  )

  source.runForeach(println)

Я ожидал, что источник будет работать 'runForEach', как и когда каждое будущее будет завершено.Но вместо этого выполняются все 4 вызова API, а затем данные в источнике печатаются сразу.Разве это не должно быть печать данных как и доступны?Я использую Await для каждого будущего.Таким образом, гарантируется, что до следующего будущего Awaited, результат предыдущего будущего доступен и может использоваться println

1 Ответ

0 голосов
/ 20 января 2019

Использование mapAsync:

Передать входящие элементы в функцию, которая возвращает результат Future.Когда приходит Future, результат передается вниз по течению.Одновременно может обрабатываться до n элементов, но независимо от времени их завершения входящий заказ будет сохранен после завершения результатов.

val pageDataFutures: Seq[Future[PageData]] = ???

Source(pageDataFutures)
  .mapAsync(parallelism = 1)(x => x) // or: mapAsync(parallelism = 1)(identity)
  .runForeach(println)
...