2017-08-16 36 views
1

您好我有两个期货FutureA和FutureB我想从FutureB取一个值,在FutureA使用它,但所有我得到是空 这里是代码如何在外部将来在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 
     } 

我想someResult返回6但它返回1 我怎么能做到这一点 我不想使用阻塞调用await.result

回答

1

迪玛的回答是绝对正确的。你没有分配FutureB.map的结果,所以它基本上是一个潜在的后台线程潜在的执行,而你的代码不知道。在变量获得增量之前,您可能会在运行时达到打印语句,但可能不会,您不知道。

正确的做法是使用不可变变量,并使用flatMap/map链接您的期货。

假设你有一个叫做someFunction的函数,它需要两个Int s并返回一个Result类型:def someFunction(a: Int, b: Int): Result。然后,您可以编写如下代码:

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

您也可以使用它写一个换理解编译为同样的事情,但这样做的标准方式:

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

希望这回答你的问题。

+1

是的,它确实感谢很多 – swaheed

5

不要使用var,尤其是期货。这是代码味道,并要求麻烦。

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

但我想从未来B的价值和未来的使用我该怎么做 – swaheed

+0

非常感谢你 – swaheed