2016-03-18 3 views
1

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

// 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, ждать их все до конца, а затем использовать все их результаты вместе.

+6

'Future.sequence (asyncs)' – cchantep

ответ

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! 
}