Scala:未来Stack溢出错误的递归

时间:2017-03-13 09:57:22

标签: scala recursion stack-overflow concurrent.futures

请考虑以下代码段。太多的take()调用将导致堆栈溢出错误。克服这种情况的好策略是什么?

def take(): Future[Int] = {
    val processResponseF: Future[Boolean] = performSomeAction()
    processResponseF.flatMap(
      processResponse => {
        if(processResponse)
          Future.successful(100)
        else
          take()
      }
    )
  }

def performSomeAction(): Future[Boolean] = {
  //This returns future of boolean
}

假设 - 1.不应更改方法签名

1 个答案:

答案 0 :(得分:2)

  

太多的take()调用将导致堆栈溢出错误。

它没有赢。当一个返回Future的方法以递归方式调用自身时,所有该方法都知道它具有将在稍后填充(可能)的未来值。实际代码在不同的堆栈上执行,因为它需要从原始调用异步完成,甚至可能不会在同一个线程上发生。