我正在阅读关于使用期货和后备的内容,请阅读以下页面:
我没有看到我期待的行为。
我有以下测试(摘自页面并稍加修改):
import scala.concurrent._
import scala.util._
import ExecutionContext.Implicits.global
val usdQuote = future {
sys.error("1")
"20.0"
} map {
usd => "Value: " + usd + "$"
}
val chfQuote = future {
sys.error("2")
"15.0"
} map {
chf => "Value: " + chf + "CHF"
}
val anyQuote = usdQuote fallbackTo chfQuote
anyQuote onSuccess { case s => println(s) }
anyQuote onFailure { case t => println("error ... " + t) }
我一直在玩评论/取消注释报价期货中的sys.error()调用。没有sys.error会给我输出“Value:20 $”。启用第一个sys.error()会给我“Value:15CHF”。到目前为止一切都那么好,但是当我启用第二个sys.error()时,据我所知,它应该给我第一个未来的例外,即“错误...... 1”,但它给了我“错误.. .2“。
有人能解释我的错误吗?
谢谢, 马克。
答案 0 :(得分:2)
文档似乎与实现不一致。
我从scala v2.10.3
获取了这些片段// In Future.scala
def fallbackTo[U](that: Future[U]): Future[U] = {
val p = Promise[U]()
onComplete {
case s @ Success(_) => p complete s // first future succeeded
case _ => p completeWith that // first future failed, complete promise with second
}
p.future
}
// In Promise.scala
final def completeWith(other: Future[T]): this.type = {
other onComplete { this complete _ } // complete the promise with second future's result
this
}
我们可以看到承诺是在第一次成功或第二次未来成功/失败的情况下完成的。
因此,如果两个期货都失败,我们就会失败第二个未来。
答案 1 :(得分:1)
这似乎是实施中的一个错误,请看这个问题: