【问题标题】:Scala Futures Functional Composition - how to access first result?Scala Futures 功能组合 - 如何访问第一个结果?
【发布时间】:2013-11-26 13:57:33
【问题描述】:

新手scala问题。

考虑http://docs.scala-lang.org/sips/pending/futures-promises.htmlval中的例子

rateQuote = future {
  connection.getCurrentValue(USD)
}
val purchase = rateQuote map {
  quote => if (isProfitable(quote)) connection.buy(amount, quote)
           else throw new Exception("not profitable")
}
purchase onSuccess {
  case _ => println("Purchased " + amount + " USD")
}

如何在购买 onSuccess 中访问报价变量,例如:

purchase onSuccess {
  case _ => println("Purchased " + amount + " USD for quote" + quote)
}

我可以简单地将它在 map 中分配给某个全局变量.. 但是呢?

【问题讨论】:

    标签: scala


    【解决方案1】:

    假设Quote是类型:

    purchase onSuccess {
      case quote: Quote => println(s"Purchased  $amount USD for $quote")
      case _ => println("Not a quote, something went wrong")
    }
    purchase onFailure {
      // failure is a Throwable!
      case failure => println("oops");
    }
    
    purchase on Success {
       case quote: Quote => println(s"Purchased $amount USD for $quote")
    }
    

    【讨论】:

    • 实际上在这个特定的例子中你不能没有类型:case quote => ...
    • 谢谢!,再澄清一下,如果 connection.buy 也返回了某种类型怎么办?我怎样才能做到这一点?因为现在如果我理解报价案例有不同的范围?
    【解决方案2】:

    这也应该有效

    purchase onSuccess { result =>
        println("Purchased " + amount + " USD")
    }
    

    虽然case 非常适合用于解构复杂对象,例如在使用case classOptionTryTuple 时,但它不是强制性的,特别是如果您想要的值to access 是一个简单的类似标量的值。

    【讨论】:

      猜你喜欢
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      相关资源
      最近更新 更多