【问题标题】:replace a while loop with Future in scala在scala中用Future替换while循环
【发布时间】:2017-07-21 04:05:27
【问题描述】:

我有一个返回值为 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)
}

【问题讨论】:

  • 小心,如果 def func 在同一次调用中返回不同的值,它看起来不是纯函数。

标签: scala


【解决方案1】:

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

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)
    }
}

【讨论】:

  • 您可能想要执行 Future.unit.flatMap(_ => func()) iso plain func() 以确保抛出的异常在生成的 Future 中。
猜你喜欢
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 2017-09-13
相关资源
最近更新 更多