Biorąc pod uwagę następujące metody ...Dla zrozumienia: jak uruchomić Futures kolejno
def doSomething1: Future[Int] = { ... }
def doSomething2: Future[Int] = { ... }
def doSomething3: Future[Int] = { ... }
... A po za-zrozumieniem:
for {
x <- doSomething1
y <- doSomething2
z <- doSomething3
} yield x + y + z
trzech metod prowadzone równolegle, ale w moim przypadku doSomething2
MUSI biec po doSomething1
skończył. Jak uruchomić kolejno trzy metody?
EDIT
Jak sugeruje Philosophus42, tutaj poniżej jest możliwe wdrożenie 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)))
}
... więc Future
tworzony jest przez wewnętrzne wezwanie do innej metody.
EDIT 2
Być może uprościć sprawę używać zbyt dużo ... i przepraszam. Spróbujmy jeszcze raz i bliżej rzeczywistego przypadku użycia. Oto trzy metody:
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
Co próbuję zrobić, to utworzyć dziennik dla każdej transakcji związanej z zamówieniem. logService.insert
jest wielokrotnie wywoływana, nawet jeśli transactions
zawiera tylko jeden wpis.
Czy masz próbkę kodu, która się nie udała? Ponieważ dla zrozumienia wystarczy wykonać Futures w sekwencjach, jeśli nie są one tworzone poza {...}. – Philosophus42
"Przyszłość" jest tworzona przez wewnętrzne wywołanie innej metody ... zobacz mój zaktualizowany wpis. – j3d
j3d: Jakie dokładnie metody ** nie ** będą wykonywane równolegle? Jestem zirytowany, ponieważ mówisz głównie o liczbie wywołań 'logService.insert'. Proszę podać działający fragment i/lub podać więcej informacji na temat tego, co dokładnie robią metody. –