没有等待的尾递归

问题描述 投票:1回答:1

我有一个场景,当我在map中对calltoFutureMethod(data)方法的调用发生扭曲时,程序会在将来的调用执行之前结束程序。

所以我用Await.result替换了它,但是我不想使用Await,因为它阻塞了,但也不能这样做:

calltoFutureMethod(data) map{
result => sendData(newData)
}

因为尾递归是不允许的。没有其他方法,没有Await和Thred.sleep并具有尾递归功能?

   @scala.annotation.tailrec
      def sendData(
      data: List[String]
      ): Unit =
    data match {
    case head::tail =>
         val result = for {
         p <- calltoFutureMethod(data)
         } yield p
         val putDataList = Await.result(result, 10.seconds)
         sendData(newData)
         }
    case Nil => ...
    }

    def callToFutureMethod(data: List[String]) =
    {
    Future
     {
     }
    }
scala tail-recursion
1个回答
0
投票

如果您在map /flatMap/ Future上使用IO / Task或任何其他实现蹦床安全的结构,则无需使用尾递归。因此:

calltoFutureMethod(data) map {
  result => sendData(newData)
}

是安全的。

程序终止的事实可能是因为您使用的ExecutionContexta daemon-如果所有剩余线程都是守护程序,则允许JVM终止,因此要么等待main函数中的将来结束,或至少在这些期货中定义/使用不是恶魔的ExecutionContext

© www.soinside.com 2019 - 2024. All rights reserved.