2013-11-26 5 views
0

новый товар scala вопрос.Функциональная композиция Scala Futures - как получить доступ к первому результату?

Учитывая пример http://docs.scala-lang.org/sips/pending/futures-promises.html вал

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

Я мог бы просто назначить его на карте до некоторой глобальной переменной .. но ?

ответ

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") 
} 
+2

На самом деле в этом конкретном примере вы не можете идти без типа: 'case quote => ...' –

+0

Спасибо !, еще одно уточнение, что, если connection.buy также вернул какой-то тип? Как я могу это сделать в случае? Потому что теперь, если я понимаю, что кодекс имеет разный объем? – gerasalus

0

это также должно работать

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

в то время как case хорошая вещь, чтобы использовать для деконструкции сложного объекта, например, при работе с case class, Option, Try , или Tuple, это не обязательно, особенно если значение, которое вы хотите получить, является простым скалярным значением.

Смежные вопросы