Что-то вроде этого perahps:
@tailrec
def withDelay(
uris: Seq[String],
delay: Duration = 1 second,
result: List[Future[Response]] = Nil,
): Seq[Future[Response]] = uris match {
case Seq() => result.reversed
case (head, tail@_*) =>
val v = result.headOption.getOrElse(Future.successful(null))
.flatMap { _ =>
akka.pattern.after(delay, context.system.scheduler)(httpRequest(head))
}
withDelay(tail, delay, v :: result)
}
у этого также есть задержка перед первым выполнением, но я надеюсь, достаточно ясно, как избавиться от него при необходимости ... Еще одно предостережение заключается в том, чтоэто предполагает, что все фьючерсы успешны.Как только происходит сбой, вся последующая обработка прерывается.Если вам нужно другое поведение, вы можете заменить .flatMap
на .transform
или добавить .recover
и т. Д.
Вы также можете написать то же самое с .foldLeft
, если хотите:
uris.foldLeft(List.empty[Future[Response]]) { case (results, next) =>
results.headOption.getOrElse(Future.successful(null))
.flatMap { _ =>
akka.pattern.after(delay, context.system.scheduler)(httpRequest(next))
} :: results
}.reversed