如何在scala中使用外部未来的内在未来价值

时间:2017-08-16 14:59:00

标签: scala future

您好我有两个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

2 个答案:

答案 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)

希望这能回答你的问题。