Angesichts der folgenden Methoden ...Zum Verständnis: wie Futures sequentiell
def doSomething1: Future[Int] = { ... }
def doSomething2: Future[Int] = { ... }
def doSomething3: Future[Int] = { ... }
... und die folgenden für Verständnis auszuführen:
for {
x <- doSomething1
y <- doSomething2
z <- doSomething3
} yield x + y + z
Die drei parallel laufen Methoden, aber in meinem Fall doSomething2
muss laufen, nachdem doSomething1
beendet ist. Wie führe ich die drei Methoden nacheinander aus?
EDIT
Wie Philosophus42 vorgeschlagen, ist hier unten eine mögliche Implementierung von doSomething1
:
def doSomething1: Future[Int] = {
// query the database for customers younger than 40;
// `find` returns a `Future` containing the number of matches
customerService.find(Json.obj("age" -> Json.obj("$lt" -> 40)))
}
... so die Future
wird durch einen internen Anruf an eine andere Methode erstellt.
EDIT 2
Vielleicht vereinfacht ich den Anwendungsfall zu viel ... und es tut mir leid. Versuchen wir es noch einmal und gehen Sie näher an den realen Anwendungsfall heran. Hier sind die drei Methoden:
for {
// get all the transactions generated by the exchange service
transactions <- exchange.orderTransactions(orderId)
//for each transaction create a log
logs <- Future.sequence(tansactions.map { transaction =>
for {
// update trading order status
_ <- orderService.findAndUpdate(transaction.orderId, "Executed")
// create new log
log <- logService.insert(Log(
transactionId => transaction.id,
orderId => transaction.orderId,
...
))
} yield log
})
} yield logs
Was ich versuche zu tun, ein Protokoll für jede Transaktion mit einem Auftrag zugeordnet erstellen. logService.insert
wird oft aufgerufen, auch wenn transactions
nur einen Eintrag enthält.
Haben Sie ein Codebeispiel, das fehlschlägt? Weil die zum Verständnis die Futures tatsächlich in Sequenzen ausführen sollen, wenn sie nicht außerhalb des for {...} instanziiert werden. – Philosophus42
der 'Future' wird durch einen internen Aufruf einer anderen Methode erstellt ... siehe meinen aktualisierten Beitrag. – j3d
j3d: Welche Methoden genau willst du ** nicht ** parallel ausführen? Ich bin irritiert, da man hauptsächlich von der Anzahl der Aufrufe von 'logService.insert' spricht. Bitte versuchen Sie einen Arbeitsauszug zu geben und/oder geben Sie mehr Informationen darüber, was die Methoden genau machen. –