W jaki sposób Scala Futures łączy się z flatMap?

Pracuję nad wykorzystaniem Futures po raz pierwszy w Scali i pracuję nad przykładem użycia kombinatora flatMap; Obserwowałem tę dyskusję:

http://docs.scala-lang.org/overviews/core/futures.html

W szczególności ten przykład:

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")
}

jest tłumaczone na to:

val purchase = usdQuote flatMap {
    usd =>
         chfQuote
        .withFilter(chf => isProfitable(usd, chf))
        .map(chf => connection.buy(amount, chf))
}

Mam trochę kłopotów z uchwyceniem tego, jak i kiedy jest wykonywana flatMap?

Rozumiem, że usdQuote i chfQuote są wykonywane przez „jakiś wątek” w „jakiś czas”, a ich zarejestrowane funkcje wywołania zwrotnego zwane są pytaniami:

a) Czy aplikacje usdQuote i chfQuote są wykonywane jednocześnie? (Jestem pewien, że są).

b) W jaki sposób flatMap przypisuje wartość Future useQuote to usd? Podobnie jak w przypadku, czy jest wywoływane, gdy kończy się operacja usdQuote?

c) Jaki wątek wykonuje operację „flatMap” i „map” (prawdopodobnie więcej kontynuacji od ostatniego pytania).

Twoje zdrowie.

questionAnswers(3)

yourAnswerToTheQuestion