2014-09-16 9 views
5

ein Verfahren gegeben, die eine Future wie diese gibt ...Execute Scala Futures in Serie hintereinander

def myMethod(name: String, count: Int, default: Boolean): Future[Unit] = { 
    ... 
} 

... Ich brauche es aufzurufen N-mal, also habe ich eine Liste definiert Tupel, die die Parameter enthält, werden übergeben:

val paramList = List(
    ("text1", 22, true), 
    ("text2", 55, true), 
    ("text3", 77, false) 
) 

Wie rufe ich myMethod mit Future.traverse?

Future.traverse(paramList)(myMethod _).tupled(/* how do I pass the current tuple here? */) 
+0

Sie meinen nicht seriell? –

Antwort

9

Zwei mögliche Ansätze:

val futuresFromSequence: Future[List[Unit]] = Future.sequence(paramList.map { 
    case (a,b,c) => myMethod(a,b,c) 
}) 

val futuresFromTraverse: Future[List[Unit]] = Future.traverse(paramList)(x => x match { 
    case(a,b,c) => myMethod(a,b,c) 
}) 

Beachten Sie, dass traverse eine Sammlung nimmt und eine Funktion aus einem Element dieser Sammlung in eine Zukunft, nimmt sequence stattdessen eine Liste von Futures und klappt es auf eine Zukunft der Liste.

Wenn Sie mit der tupled Syntax bleiben (was ich persönlich nicht mögen):

Future.traverse(paramList)(x => (myMethod _).tupled(x)) 

Wie in den Kommentaren darauf hingewiesen, Sie können sie in Serie laufen (obwohl es von der Frage nicht zu 100% klar ist,), in diesem Fall können Sie foldLeft und flatMap Ketten zukünftige Ausführung verwenden:

myList.foldLeft(Future(List.empty[Unit]))((prevFuture, currentTuple) => { 
    for { 
    prev <- prevFuture 
    curr <- (myMethod _).tupled(currentTuple) 
    } yield prev :+ curr 
}) 

Wo im Grunde der erste Generator für die Zukunft im Speicher wartet abgeschlossen ist, bevor die neuen starten, dies auch gibt eine Future[List[Unit]] zurück.

+1

Dadurch werden die Futures nicht nacheinander ausgeführt. Alle werden parallel laufen. – roterl

+0

Op hat nicht angegeben, dass er, wenn er sie nacheinander ausführen muss, 'flatMap' und zum Verständnis verwenden kann, aber das ist OP-Entscheidung. –

+0

Aktualität der Beitrag Titel ist "Execute Scala Futures in der Reihe nach dem anderen". Wie kann es mit FlatMap umgesetzt werden? – roterl

Verwandte Themen