gpt4 book ai didi

scala future 和 fallbackTo

转载 作者:行者123 更新时间:2023-12-01 09:41:41 25 4
gpt4 key购买 nike

我正在阅读以下页面上关于 futures 和 fallbackTo 的使用:

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

我一直在尝试对报价 future 中的 sys.error() 调用进行注释/取消注释。没有 sys.error 的结果是“Value: 20$”。启用第一个 sys.error() 会给我“值:15CHF”。到目前为止一切顺利,但是当我启用第二个 sys.error() 时,据我所知,它应该给我第一个 future 的异常(exception),即“错误 ... 1”,但它给了我“错误 .. . 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
}

我们可以看到, promise 在第一个 future 的成功或第二个 future 的成功/失败时完成。

所以如果两个 future 都失败了,我们就会得到第二个 future 的失败。

关于scala future 和 fallbackTo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20303282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com