¿Cómo se encadenan los futuros de Scala con flatMap?
Estoy trabajando en el uso de Futures por primera vez en Scala y estoy trabajando a través de un ejemplo del uso del combinador flatMap; He estado siguiendo esta discusión:
http://docs.scala-lang.org/overviews/core/futures.html
Específicamente, este ejemplo:
val usdQuote = future { connection.getCurrentValue(USD) }
val chfQuote = future { connection.getCurrentValue(CHF) }
val purchase = for {
usd <- usdQuote
chf <- chfQuote
if isProfitable(usd, chf)
} yield connection.buy(amount, chf)
purchase onSuccess {
case _ => println("Purchased " + amount + " CHF")
}
se traduce a esto:
val purchase = usdQuote flatMap {
usd =>
chfQuote
.withFilter(chf => isProfitable(usd, chf))
.map(chf => connection.buy(amount, chf))
}
Lo que me cuesta un poco entender cómo y cuándo se ejecuta flatMap?
Entiendo que usdQuote y chfQuote se ejecutan mediante "algún hilo" en "algún momento" y se llaman a sus funciones de devolución de llamada registradas, las preguntas son:
a) ¿Se ejecutan a la vez usdQuote y chfQuote? (Estoy bastante seguro de que son).
b) ¿Cómo asigna FlatMap el valor del uso del futuro? ¿Cita a usd? Como en, ¿se llama cuando se completa la operación usdQuote?
c) ¿Qué hilo está ejecutando la operación 'flatMap' y 'map' (probablemente más como un seguimiento de la última pregunta).
Aclamaciones.