在scala中用Future替换while循环

时间:2017-07-21 04:05:28

标签: scala

我有一个返回值为Future [Int]

的函数
def func: Future[Int] = {...}

我将定期检查func的返回值,直到它满足某些条件(例如返回值大于10),然后我将使用此返回值来创建map / flatmap的其他未来值。

如何在没有任何同步代码的情况下完成此工作?如下所列:

def check: Future[Int] = {
    var ret: Int = Await.result(func, Duration.Inf)
    while (ret <= 10) {
        ret = Await.result(func, Duration.Inf)
    }
    Future(ret + 100)
}

1 个答案:

答案 0 :(得分:11)

实现此目的的一种方法是使用递归,如下所示。

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future

def check(func: () => Future[Int]): Future[Int] = {
    Future.unit.flatMap(_ => func()) flatMap {
        case x if x <= 10 => check(func)
        case x => Future.successful(x + 100)
    }
}