您好我有两个Futures FutureA和FutureB我想从FutureB获取一个值并在FutureA中使用它但我得到的只是null 这是代码
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
答案 0 :(得分:5)
请勿使用var
,尤其是期货。这是代码味道,并要求麻烦。
futureA
.flatMap { _ => FutureB }
.map { _ + 1 }
.onSuccess(println)
答案 1 :(得分:1)
Dima的回答绝对正确。您没有分配FutureB.map
的结果,因此它基本上是在后台线程中可能执行的副作用,而您的代码不知道。您可能在变量增加之前在运行时到达print语句,但可能不是,您无法知道。
正确的做法是使用不可变变量并使用flatMap / map链接你的未来。
假设您有一个名为someFunction
的函数需要两个Int
并返回Result
类型:def someFunction(a: Int, b: Int): Result
。然后,您可以编写以下代码:
val result: Future[Result] =
futureA.flatMap { a =>
FutureB.map { b =>
someFunction(a, b)
}
}
你也可以使用for-comprehension编写它,它编译成完全相同的东西但是标准的方法:
val result: Future[Result] =
for {
a <- futureA
b <- FutureB
} yield someFunction(a, b)
希望这能回答你的问题。