Динамически создавать для понимания фьючерсов и ждать завершения

У меня есть следующий код:

// Start async functions
val async1: Future[Seq[Int]] = ...
val async2: Future[Seq[Int]] = ...
val async3: Future[Seq[Int]] = ...

// Wait for completion
(for {
    a1 <- async1
    a2 <- async2
    a3 <- async3
} yield (a1, a2, a3)).map {
   // Use the results
}

Я хочу улучшить это, чтобы обрабатывать переменное количество асинхронных функций (и не обязательно вызывать каждую из них каждый раз). Что я сделал до сих пор:

// Start the async functions ?
val asyncs: Seq[Future[Seq[Int]] = otherList.filter(x => someCondition).map(x => asyncFunc(x))

// Wait for the functions to finish ?
(for (seqInt <- asyncs) yield seqInt).map {
    case results => // <-- problem here
        // Use the results 
}

У меня проблема в том, что результаты имеют тип Future[Seq[Int]], но я ожидал, что они будут типа (Seq[Int], Seq[Int], Seq[Int]), как в первом фрагменте.


В конце концов, я хотел бы запустить динамическое количество асинхронных функций, которые все имеют один и тот же тип возврата Future, дождаться их завершения, а затем использовать все их результаты вместе.


person Tyler    schedule 18.03.2016    source источник


Ответы (1)


Future.sequence — ключевая часть, которую мне не хватало (спасибо за комментарий)

// Create a list of Futures
val asyncs: Seq[Future[Seq[Int]] = otherList.filter(x => someCondition).map(x => asyncFunc(x))

// Use Future.sequence to to execute them and return a list of sequence of integers
Future.sequence(asyncs).map{ 
    case results => // Use the results List[Seq[Int]]
}.recover {
    case error => // Oh no!
}
person Tyler    schedule 21.03.2016