我正在第一次在 Scala 中使用 Futures,并且正在研究一个使用 flatMap 组合器的示例;我一直在关注这个讨论:
http://docs.scala-lang.org/overviews/core/futures.html
具体来说,这个例子:
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")
}
翻译成这样:
val purchase = usdQuote flatMap {
usd =>
chfQuote
.withFilter(chf => isProfitable(usd, chf))
.map(chf => connection.buy(amount, chf))
}
我有点难以理解的是这是如何以及何时执行 flatMap 的?
我知道 usdQuote 和 chfQuote 是由“某个线程”在“某个时间”执行的,并且它们注册的回调函数被调用,问题是:
a) usdQuote 和 chfQuote 是否同时执行?(我很确定他们是)。
b) flatMap 如何将 Future useQuote 的值赋值给 usd?例如,当操作 usdQuote 完成时它会被调用吗?
c) 哪个线程正在执行“flatMap”和“map”操作(可能更多是上一个问题的后续)。
干杯。