2017-08-16 1 views
1

Hallo innere Zukunft Wert zu verwenden, ich habe zwei Futures futureâ und FutureB Ich möchte einen Wert von FutureB nehmen und es in futureâ verwenden, aber alles, was ich bekommen habe ist null hier Codewie in äußeren Zukunft in scala

futureA = ask(ActorA, MessageA).mapTo[Int] 
    FutureB = ask(ActorB, MessageB).mapTo[Int] 
    var someResult=0 

     futureA.map { 
     result => 
      FutureB.map { x => 
       someResult=x//suppose it will retun 5 
      } 
      someResult=someResult+1//it should give 6 
      println(someResult)//here i am getting 1 
     } 

ich möchte someResult6 zurückzukehren, aber es kehrt 1 wie kann ich erreichen, dass ich Anruf nicht verwenden wollen, nicht blockiert varawait.result

Antwort

1

Dimas Antwort ist absolut richtig. Sie ordnen nicht das Ergebnis FutureB.map zu, also ist es im Grunde eine Nebenwirkung, die möglicherweise in einem Hintergrundgewinde ausgeführt wird, ohne Ihren Code zu kennen. Wahrscheinlich erreichen Sie die print-Anweisung zur Laufzeit, bevor die Variable inkrementiert wird, aber vielleicht nicht, Sie können es nicht wissen.

Der richtige Weg ist es, unveränderliche Variablen zu verwenden und Ihre Zukunft mit FlatMap/map zu verketten.

Sagen Sie eine Funktion, die someFunction dauert zwei Int s und geben einen Result Typ genannt haben: def someFunction(a: Int, b: Int): Result. Sie können dann den folgenden Code schreiben:

val result: Future[Result] = 
    futureA.flatMap { a => 
    FutureB.map { b => 
     someFunction(a, b) 
    } 
    } 

Sie können auch schreiben mit einer for-Verständnis, die genau die gleiche Sache kompilieren aber ist der normale Weg, es zu tun:

val result: Future[Result] = 
    for { 
    a <- futureA 
    b <- FutureB 
    } yield someFunction(a, b) 

Hope this beantwortet deine Frage.

+1

ja es tat vielen Dank – swaheed

5

sie einnehmen können, besonders mit Futures. Das ist Code riechen und nach Ärger fragen.

futureA 
    .flatMap { _ => FutureB } 
    .map { _ + 1 } 
    .onSuccess(println) 
+0

aber ich möchte den Wert von FutureB nehmen und in Zukunft verwendenA wie würde ich das tun – swaheed

+0

Vielen Dank – swaheed

Verwandte Themen