code:La valeur du futur dépend de si elle a été liée à une variable?
import scala.concurrent.Future
import scala.util.{Failure, Success}
import scala.concurrent.ExecutionContext.Implicits.global
/**
* Created by IDEA on 12/23/16.
*/
object Demo extends App {
val fut = Future {
Thread.sleep(100)
21 + 21
}
val f = Future { 5 }
Thread.sleep(200)
val fut1 = fut.map(_ + 1)
println(fut1) // Future(Success(43))
println(fut1.value) // Some(Success(43))
println(fut.map(_ + 1).value) // None
fut.map(_ + 1).onComplete {
case Success(v) => println(v)
case Failure(e) => println(e)
} // 43
(for {
x <- Future {Thread.sleep(100); 21 + 21}
y <- Future {Thread.sleep(100); 21 + 22}
} yield x + y).andThen {
case Success(v) => println(v)
}
Thread.sleep(5000)
}
Notez la différence entre:
println(fut1.value) // Some(Success(43))
println(fut.map(_ + 1).value) // None
à savoir, la récupération de la valeur de l'avenir après l'attribution à une variable me donne un Some(Success(43))
, lors de la récupération donne directement None
. Pourquoi?
Notez également que la méthode onComplete
génère le comportement attendu, bien qu'elle ait été appelée après la ligne println(fut.map(_ + 1).value)
.
Scala 2.12.0
Dormir le fil principal ne semble pas du tout aider sur ma machine. Pourriez-vous confirmer cela dans une scala 'App'? – qed
@qed: Je ne suis pas sûr de ce que vous voulez dire. Un 'Thread.sleep' sans assigner le résultat de' .map' n'affectera rien, et l'assigner en quelque sorte contredit la question. – Marth
S'il vous plaît voir ma modification. – qed