斯卡拉期货和后备

时间:2013-11-30 17:23:38

标签: scala

我正在阅读关于使用期货和后备的内容,请阅读以下页面:

scala docs on futures

我没有看到我期待的行为。

我有以下测试(摘自页面并稍加修改):

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“。

有人能解释我的错误吗?

谢谢, 马克。

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)

这似乎是实施中的一个错误,请看这个问题:

https://issues.scala-lang.org/browse/SI-6913