2017-06-16 4 views
1

Im folgenden Beispiel, was ist das erwartete Verhalten?Scala Karte über eine Zukunft

import scala.concurrent.ExecutionContext.Implicits.global 
val someFuture = Future { 1+1 }.map(elem => { 
    println("mapping immediately") 
    elem.toString 
}) 

someFuture.onComplete { 
    case scala.util.Success(value) => println(s"Got the callback = $value") 
    case Failure(e) => e.printStackTrace() 
} 

Ist der folgende Ausgang immer garantiert?

mapping immediately 
Got the callback = 2 
+1

Ja, das ist der Sinn der Karte, Dinge zu verketten und Ihnen eine neue Zukunft zu geben, in der die Berechnungen verkettet sind. – flavian

+1

Wenn Sie fragen, ob die Mapping-Funktion immer ausgeführt wird, bevor das Ergebnis der Mapping-Funktion dem onComplete-Handler übergeben wird, dann yes. – rompetroll

+0

Cool! Das habe ich erwartet – sparkr

Antwort

4

Kommt drauf an.

val someFuture = Future { 1+1 }.map(elem => { 
    println("mapping immediately") 
    elem.toString 
}) 

someFuture wird mit Spannung ausgeführt werden, und die println ausgeführt.

someFuture.onComplete { 
    case scala.util.Success(value) => println(s"Got the callback = $value") 
    case Failure(e) => e.printStackTrace() 
} 

onComplete ist ein Ereignis-Listener für einen Future. Dies wird nur aufgerufen, wenn diese Zukunft abgeschlossen ist, entweder durch eine Ausnahme oder einen Wert, um die angegebene Funktion anzuwenden.

Daher wird es immer nach der Ausführung der someFuture ausgeführt.

Unter der Annahme, dass die someFuture wird nicht scheitern, den Auftrag

`mapping immediately 
Got the callback = 2` 

garantiert.

Aus welchem ​​Grund auch immer, wenn eine Ausnahme ausgelöst wird, würde sich das Ergebnis ändern. In diesem Fall Got the callback = 2 wird nicht gedruckt werden und mapping immediately kann oder darf nicht gedruckt werden.

Hoffe, das hilft.