我有一个场景,当我在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
{
}
}
如果您在map
/flatMap
/ Future
上使用IO
/ Task
或任何其他实现蹦床安全的结构,则无需使用尾递归。因此:
calltoFutureMethod(data) map {
result => sendData(newData)
}
是安全的。
程序终止的事实可能是因为您使用的ExecutionContext
是a daemon-如果所有剩余线程都是守护程序,则允许JVM终止,因此要么等待main
函数中的将来结束,或至少在这些期货中定义/使用不是恶魔的ExecutionContext
。